ServerPlugin Hilfe bei meinem Plugin

Dieses Thema im Forum "Programmierung" wurde erstellt von LoganBwDE, 5. Juli 2015.

  1. LoganBwDE
    Offline

    LoganBwDE

    Registriert seit:
    26. November 2014
    Beiträge:
    184
    Ort:
    Abtsgmünd
    Minecraft:
    LoganBwDE
    Hallöle,

    und zwar brauche ich Hilfe bei meinem Plugin. Dies sieht folgendermaßen aus:
    Man platziert ein Schild und schreibt in der ersten Zeile den Prefix hin. In der Zweiten Zeile die Item ID und dritte Zeile Wie oft das Item. Nun klappt alles auch gut. Inventar mit dem Item wird geöffnet. Doch nun zu ein paar kleinen Verbesserungen, die ich nicht hinbekomme. Und zwar möchte ich gerne, dass anstatt der ItemID das Material als Name angezeigt wird. was ich schon durch eine neue Funtkion versucht habe, jedoch gescheitert bin. Desweiteren hätte ich gerne einen Timer, der immer abfragt, ob der Spieler bereits 5 Sekunden gewartet hat, bevor er das Schild anklickt. Auch bereits durch eine ArrayList versucht, bin jedoch gescheitert. Zuletzt wollte ich es noch so machen, dass der Name der Chest nicht Chest ist sondern veränderbar ist, nur wie man diesen ändern kann, weiß ich leider nicht. Wenn jemand ein paar Code-Beißpiele oder Hilfen bzw. Lösungen eines oder mehrerer Probleme hat, wäre ich äußerst dankbar.

    Gruß
    LoganBwDE
     
    #1
  2. GPSforLEGENDS
    Offline

    GPSforLEGENDS

    Registriert seit:
    21. März 2014
    Beiträge:
    295
    Ort:
    Bürostuhl
    Minecraft:
    GPSforLEGENDS
    ItemName:
    Code (Text):
    1. ItemStack stack = new ItemStack(1);
    2.         ItemMeta meta = stack.getItemMeta();
    3.         meta.setDisplayName(stack.getType().toString());
    4.         stack.setItemMeta(meta);
    Timer: Spieler in die Arraylist einfügen, dann scheduler starten der den SPieler nach 5 sekunden wieder asunimmt.
    Wenn ein Spieler eine Kiste recht anklickt einfach canceln, dann ein inventory erstellen und den name ändern und die items für das inventory einfach aus der Kiste übernehmen.
     
    #2
  3. LoganBwDE
    Offline

    LoganBwDE

    Registriert seit:
    26. November 2014
    Beiträge:
    184
    Ort:
    Abtsgmünd
    Minecraft:
    LoganBwDE
    Muss mich wohl korrigieren. Auf dem Schild wird abgefragt, welche ID man eingegeben hat und daraus wird dann ein Inventar mit dem Item erstellt. Die ID steht somit immernoch auf dem Schild. Doch wie bekomme ich nun den ItemNamen, um ihn wieder beim Schild auszugeben. Er klickt ein Schild an, dass ein virtuelles Inventar erstellt, doch mit dem Namen Chest. Doch wie kann man den verändern? :D
     
    #3
  4. Kronos197
    Offline

    Kronos197

    Registriert seit:
    20. Dezember 2013
    Beiträge:
    153
    Ort:
    Frankfurt
    Minecraft:
    Kronos197
    Zum Inventar:

    Code (Text):
    1. Inventory inv = Bukkit.getInventory(null, InvGröße, InvName, InvType;
    2.  
    Zum Material:

    Also vom Materialnamen zum Material:
    Code (Text):
    1. Material mat = Material.getMaterial("STONE");
    und von der Id zum Name:
    Code (Text):
    1. String materialname = Material.getMaterial(ID).toString();
    2.  
    und vom namen zur ID:
    Code (Text):
    1. Integer ID = Material.getMaterial("STONE").getId();
    2.  
    Das sind die sachen womit du probleme hattest. (So habe ich deine Frage gedeuted)

    Ich hoffe ich konnte dir helfen.
    LG
    Kronos197
     
    #4
  5. LoganBwDE
    Offline

    LoganBwDE

    Registriert seit:
    26. November 2014
    Beiträge:
    184
    Ort:
    Abtsgmünd
    Minecraft:
    LoganBwDE
    Also Neues Problem: Ich bekomme eine NullPointerExeption....
    Log und Code im Anhang ( Bitte nicht hauen, bin auch nur ein Mensch ;) )

    Gruß
    LoganBwDE
     

    Anhänge:

    #5
  6. GPSforLEGENDS
    Offline

    GPSforLEGENDS

    Registriert seit:
    21. März 2014
    Beiträge:
    295
    Ort:
    Bürostuhl
    Minecraft:
    GPSforLEGENDS
    Ich würde dir dringend empfehlen erst ein paar tutorial zu gucken bzw. mehr o_O
    Dein Fehler ist zeile 39
    Code (Text):
    1. Caused by: java.lang.NullPointerException
    2.     at me.loganbwde.KostenlosSchild.main.<init>(main.java:39) ~[?:?]
    du versuchst da den Namen von einen Spieler heraus zu finden durch ein Event das garnicht existiert (null)
     
    #6
  7. LoganBwDE
    Offline

    LoganBwDE

    Registriert seit:
    26. November 2014
    Beiträge:
    184
    Ort:
    Abtsgmünd
    Minecraft:
    LoganBwDE
    xD thx... kenn mich mit logs von minecraft halt kaum aus :D

    EDIT: So nun 2 letzte Fragen, dann wäre das alles :D

    1. Kann man einem Inventarnamen auch in Farbe anzeigen lassen, da ich nur "§bKostenlos" hinbekomme jedoch kein farbigen Text?
    2. Wie frägt man ab, ob der Spieler das virtuelle Inventar verlassen bzw. geschlossen hat?
     
    #7
  8. HardcorePvP
    Offline

    HardcorePvP

    Registriert seit:
    3. September 2012
    Beiträge:
    92
    Ort:
    München
    Minecraft:
    blooditor
    1. §b ist Aqua also sollte das "Kostenlos" dann Aqua angezeigt werden.
    2.
    Code (Text):
    1. public void close(InventoryCloseEvent e){
    2.    if(e.getInventory().getName().equals("§bKostenlos")){
    3.      ...}}
    P.S all deine Fragen werden auch in anderen Foren häufig gestellt also benutz vorher immer Google weil dann lernt man es auch besser als wenn dir einfach der Code hingeklatscht wird ;)
     
    #8
  9. LoganBwDE
    Offline

    LoganBwDE

    Registriert seit:
    26. November 2014
    Beiträge:
    184
    Ort:
    Abtsgmünd
    Minecraft:
    LoganBwDE
    Glaub mir ich google auch, finde nur oft nichts.

    Also habe jetzt mal versucht, die ID durch den Material-Namen zu ersetzen.
    Der Code dazu:
    Code (Text):
    1.  
    2. Sign schild = (Sign)event.getBlock().getState();
    3. int id = Integer.parseInt(schild.getLine(1));
    4. mat  = Material.getMaterial(id).toString();
    5. event.setLine(0, scolour + prefix);
    6. event.setLine(1, scolour2 + mat);
    7. schild.update(true);
    8.  
    Der Fehler dazu:
    [20:37:14] [Server thread/ERROR]: Could not pass event SignChangeEvent to KostenlosSchild v1.1
    org.bukkit.event.EventException
    at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[start.jar:git-Spigot-1649]
    at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[start.jar:git-Spigot-1649]
    at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:514) [start.jar:git-Spigot-1649]
    at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:499) [start.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.PlayerConnection.a(PlayerConnection.java:1713) [start.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.PacketPlayInUpdateSign.a(PacketPlayInUpdateSign.java:58) [start.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.PacketPlayInUpdateSign.handle(PacketPlayInUpdateSign.java:78) [start.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.NetworkManager.a(NetworkManager.java:186) [start.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.ServerConnection.c(ServerConnection.java:81) [start.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.MinecraftServer.v(MinecraftServer.java:734) [start.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.DedicatedServer.v(DedicatedServer.java:289) [start.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.MinecraftServer.u(MinecraftServer.java:584) [start.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.MinecraftServer.run(MinecraftServer.java:490) [start.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.ThreadServerApplication.run(SourceFile:628) [start.jar:git-Spigot-1649]
    Caused by: java.lang.NumberFormatException: For input string: ""
    at java.lang.NumberFormatException.forInputString(Unknown Source) ~[?:1.7.0_65]
    at java.lang.Integer.parseInt(Unknown Source) ~[?:1.7.0_65]
    at java.lang.Integer.parseInt(Unknown Source) ~[?:1.7.0_65]
    at me.loganbwde.KostenlosSchild.main.onSignCreate(main.java:99) ~[?:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0_65]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.7.0_65]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.7.0_65]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.7.0_65]
    at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:298) ~[start.jar:git-Spigot-1649]
    ... 13 more

    Ich weiß das das Format nicht simmt, nur wenn ich ändere bekomme ich eine NullPointerExeption.

    Und dass mit der Inventar Farbe klappt leider nicht.
    Geht doch, hatte einen Denkfehler drinnen.
     
    #9
  10. GPSforLEGENDS
    Offline

    GPSforLEGENDS

    Registriert seit:
    21. März 2014
    Beiträge:
    295
    Ort:
    Bürostuhl
    Minecraft:
    GPSforLEGENDS
    Fehler ist Zeile 99
     
    #10
  11. LoganBwDE
    Offline

    LoganBwDE

    Registriert seit:
    26. November 2014
    Beiträge:
    184
    Ort:
    Abtsgmünd
    Minecraft:
    LoganBwDE
    Das hab ich auch schon rausgefunden -.- nur er will irgendwie den String nicht schnallen..

    EDIT: Alles tut nun wie es soll, doch das mit dem ID vom Schild holen, dann Material davon rausfinden und zuletzt auf das Schild ausgeben funktioniert als einziges immer noch nicht...
     
    #11
  12. ShareLock
    Offline

    ShareLock

    Registriert seit:
    2. November 2011
    Beiträge:
    70
    Deswegen sollte man auch eine Programmiersprache lernen und sich nicht alles zusammenfragen und kopieren. "Ich finde bei google nix" - Natürlich findest du bei google nichts, wenn du einfach die falschen Begriffe googlest.

    Im übrigen: Gute Ergebnisse in google findet man im übrigen nicht bei deutschen Suchbegriffen, denn die meisten deutschen "Programmierer" sind Idioten und eben Personen, die sich dinge zusammenkopiert haben um dann anderen zu sagen: "jahaha, das geht so: ...."

    Wenn man sich schon eine Linie von einem Schild liest, dann hat man auch gefälligst einen try catch block zu setzen, so wie du es dort implementiert hast. Der Nutzer kann _immer_ keine Zahl angeben. - getLine startet im übrigen, wie so fast alles in der Informatik, mit 0.
    Im übrigen sind warscheinlich RegEx hier sinnvoller, aber das werde ich dir sicherlich nicht vorkauen.

    Außerdem kannst "0" + sign.getLine(i) machen, dann sollten zumindest einige Fehler unterdrückt werden...

    PS: Arg.. Immer... deutsche... namen... in englischem mix... arghhh...
    PPS: "Ich kann eben nicht so gut Englisch" - Na dann lerne es oder programmiere eben nicht. So einfach ist das.
     
    #12
    pasce1998 gefällt das.
  13. LoganBwDE
    Offline

    LoganBwDE

    Registriert seit:
    26. November 2014
    Beiträge:
    184
    Ort:
    Abtsgmünd
    Minecraft:
    LoganBwDE
    Wenn du jetzt hier meine Kenntnisse in Frage stellst, mir egal. Doch verzehl mir mal, wo ich "Ich kann eben nicht so gut Englisch" geschrieben habe ;D Programmieren tu ich außerdem seit 3 Jahren, dies aber nur in C++ und Php sowie Html. Java ist nicht komplett Neuland doch Bukkit leider schon.

    "denn die meisten deutschen "Programmierer" sind Idioten und eben Personen, die sich dinge zusammenkopiert haben um dann anderen zu sagen: "jahaha, das geht so: ...." "
    Wenn du einen Beleg dafür hast gerne.

    Als einziger Fehler ist nur noch, wie bereits gesagt, das abholen der Zahl vom Schild, das bilden des Materials aus der ID und dann wieder auf das Schild schreiben. Problem einzig und allein ist dabei das Bilden des Materials aus der ID, bei dem ich leider nicht weiter weißt.

    Gruß
    LoganBwDE
     
    #13
  14. GPSforLEGENDS
    Offline

    GPSforLEGENDS

    Registriert seit:
    21. März 2014
    Beiträge:
    295
    Ort:
    Bürostuhl
    Minecraft:
    GPSforLEGENDS
    Code (Text):
    1. ItemStack stack = new ItemStack(zahl);
    2. Material mat = stack.getType();
    PS: fürs nächste mal, einfach google benutzen... da findest du ALLES zu bukkit... einfach richtigen Syntax benutzen -> bukkit (das was du machen willst auf englisch) -> z.B bukkit id to material
     
    #14
  15. ShareLock
    Offline

    ShareLock

    Registriert seit:
    2. November 2011
    Beiträge:
    70
    Allein die Tatsache, dass du in deutsch schreibst. Gemeint war es im übrigen, dass eine derartig lächerliche Rechtfertigung nicht verwendet werden kann. Erkennbar am "-".

    Copy & Paste schreibt man übrigens nicht "Programmieren". Deine Rechtfertigung ist lächerlich. Davon mal abgesehen, dass HTML keine Kunst ist. [Im übrigen: Jeder Programmierer kann jede Programmiersprache verwenden, jedoch muss er sich etwas an die neuen Syntax elemente gewöhnen. Wenn du also C++ könntest, gäbe es kein Problem mit Java. Das anwenden einer API ist für einen richtigen Programmierer im übrigen auch kein Problem.

    Du. Du bist ja anscheinend nicht fähig folgendes zu finden:
    https://github.com/Bukkit/Bukkit/blob/master/src/main/java/org/bukkit/Material.java#L575

    Das Nitradoforum, *snip* und *snip* sind übrigens auch ziemlich gute Anlaufstellen für derartige Experten.
     
    #15
  16. Darkangel93424
    Offline

    Darkangel93424

    Registriert seit:
    28. Januar 2012
    Beiträge:
    20
    Minecraft:
    Darkangel
    Noch ein kleiner Tipp am Rande: Ich würd das mit den 5 Sekunden nicht durch einen Sheduler und einer Arraylist mit dem Spielernamen lösen, sondern dem Spieler eine Metadata mit einem Timestamp geben. diese Metadata dann bei dem Clickevent abfragen und errechnen ob 5 Sekunden um sind. Ist ein kleinerer Speicheraufwand und auch performanceschonender ;)
     
    #16
  17. Inkemann
    Offline

    Inkemann

    Registriert seit:
    3. Mai 2015
    Beiträge:
    341
    Ort:
    Aachen
    Minecraft:
    Inkemann
    Der Speicheraufwand ist nicht kleiner, sondern im Mittel sogar größer ^^ Wobei man hier von Mengen spricht, bei denen weder Speicherbedarf noch Rechenaufwand eine messbare Rolle spielen.
     
    #17
  18. Darkangel93424
    Offline

    Darkangel93424

    Registriert seit:
    28. Januar 2012
    Beiträge:
    20
    Minecraft:
    Darkangel
    naja kleinvieh macht auch mist und timer für 5 sec konstruiren ist unnötig oversized
     
    #18
  19. Inkemann
    Offline

    Inkemann

    Registriert seit:
    3. Mai 2015
    Beiträge:
    341
    Ort:
    Aachen
    Minecraft:
    Inkemann
    Selbst bei 10.000 Spielern macht das keinen sinnvoll messbaren Unterschied.
     
    #19
  20. Darkangel93424
    Offline

    Darkangel93424

    Registriert seit:
    28. Januar 2012
    Beiträge:
    20
    Minecraft:
    Darkangel
    doch tut es. Selbst wenn das nur ein unterschied von 10 ms ist wäre das bei 10.000 Spieler ein Faktor von 100 sec. (ist hier unrealistisch, da nicht jeder auf das Schild klikt, jedoch hab ich mein Beispiel nicht gemessen). Ich hab hier auch wenig Interesse mi t dir zu diskutieren ob und wann das relevant ist. Fakt ist, dass es mit einer Metadata weniger Traffic verursacht (und das schon ab 1 Spieler, auch wenn das nur wenige microssekunden sind). Wir wissen ja alles, das in Java vorallem das erstellen von Objekten zeitintensiv ist (teilweise im sekundenbereich). Kannst ja gerne eine geeignete Testreihe machen.
     
    #20