Coding mit Java | Java-basierten APIs

  • Ersteller Ersteller ij9F_i0FaF-d9lrDSDDpDbfo
  • Erstellt am Erstellt am
Status
Für weitere Antworten geschlossen.
Hey,

ich möchte, dass wenn ein Spieler auf den Server joint ein Header bei Tab angezeigt wird, dazu benutzte ich eine Funktion, die beim PlayerJoinEvent aufgerufen wird, allerdings wird sofort wieder gekickt, wenn man verusucht zu joinen.

Code:
public static void addTabHeader(Player p, String headerTxt){
        CraftPlayer cp = (CraftPlayer) p;
        PlayerConnection connection = cp.getHandle().playerConnection;
        IChatBaseComponent header = ChatSerializer.a("{text:'" + headerTxt + "'}");
        PacketPlayOutPlayerListHeaderFooter packet = new PacketPlayOutPlayerListHeaderFooter();
    
        Field headerField;
        try {
            headerField = packet.getClass().getDeclaredField("a");
            headerField.setAccessible(true);
            headerField.set(packet, header);
            headerField.setAccessible(!headerField.isAccessible());
        } catch (Exception e) {
            e.printStackTrace();
        }

        connection.sendPacket(packet);
    }

Weiß jemand von euch, wie man das beheben kann?
Benutze das so... Dann kannst du einfach .sendTabTitle(player.getName(), "TEXT123", "TEXT123") Wobei der Header das über der Tatlist und der Footer das unter Tablist ist
PHP:
public static void sendTabTitle(Player player, String header, String footer) {
            if (header == null) header = "";
            header = ChatColor.translateAlternateColorCodes('&', header);

            if (footer == null) footer = "";
            footer = ChatColor.translateAlternateColorCodes('&', footer);

            PlayerConnection connection = ((CraftPlayer)player).getHandle().playerConnection;
            IChatBaseComponent tabTitle = ChatSerializer.a("{\"text\": \"" + header + "\"}");
            IChatBaseComponent tabFoot = ChatSerializer.a("{\"text\": \"" + footer + "\"}");
            PacketPlayOutPlayerListHeaderFooter headerPacket = new PacketPlayOutPlayerListHeaderFooter(tabTitle);
            try
            {
              Field field = headerPacket.getClass().getDeclaredField("b");
              field.setAccessible(true);
              field.set(headerPacket, tabFoot);
            } catch (Exception e) {
              e.printStackTrace();
            } finally {
              connection.sendPacket(headerPacket);
            }
          }
 
  • Like
Reaktionen: PhoenixofForce
Frage : Wie kann ich eine nachricht ausgeben die nach einer bestimmten zeit stoppt?
Hey,
ich kann nicht eindeutig deuten worauf du in deiner Frage hinaus willst, aber ich vermute du hast eine Nachricht die mehrfach wiederholt wird, und du möchtest sie nach einer gewissen Zeit stoppen lassen.

Da es sich hier um zeitliche Abläufe handelt, möchte ich das ganze ein wenig erläutern, da hierbei durchaus viele Fehler zustande kommen. Alors, on y va!

Bevor du anfängst visualisierst du dir dein Problem. Mit der Erfahrung ist dies bei so Kleinigkeiten nicht mehr großartig notwendig ; aber jeder fängt klein an.

Zunächst einmal , wir möchten irgendeine Zahl stetig dekrementieren, bis sie 0 ist. Bei jeder Dekrementierung wird jeweils eine Nachricht ausgegeben, und am Ende bricht unser Programm ab.
Zunächst einmal erstellen wir uns eine Variable, die angibt wie lange wir denn runterzählen möchten. Die Rechnung hierfür ist sehr einfach, eine Sekunde entspricht 20 Ticks, d.h. 10 Sekunden entsprechen 200 Ticks. Der Variablentyp ist in diesem Fall long. Unsere Variable sieht folglich also so aus:
Code:
private long counter = 200L;

Da wir nun keinen Deadlock produzieren möchten, brauchen wir einen Task. Und da wir diesen später auch noch beenden möchten, speichern wir uns die entsprechende Objektreferenz. Das funktioniert über das Interface "BukkitTask".
Da BukkitTask wie eben erwähnt nur ein Interface ist, können wir es nicht einfach ohne weiteres konstruieren. Doch gütigerweise gibt uns der BukkitScheduler folgende Methode zum erstellen einer Bukkit Task:
Code:
Bukkit.getScheduler().runTaskTimer(this, new Runnable() {
     public void run() {
       //Weiterer Code
     }
}, 0L, 20L);
Dieser Codeblock erstellt uns einen BukkitTask und startet ihn auch gleich! Unser Delay pro Taskdurchlauf beträgt 20 Ticks, also genau eine Sekunde, und der Task wird an ein JavaPlugin gebunden, in diesem Falle this (das bedeutet , die Klasse die diesen Codeblock enthält muss zwangsweise von JavaPlugin erben)

Nun möchten wir ja unseren counter dekrementieren und ggF. eine Nachricht ausgeben. Das sieht so aus:
Code:
private BukkitTask task;
private long counter = 200L;

task = Bukkit.getScheduler().runTaskTimer(this, new Runnable() {
     public void run() {
         if (counter >= 20L) {  //Wir prüfen ob ob der Counter größer oder gleich 20 Ticks ist.
             Bukkit.broadcastMessage("Hey");  //Wir geben die Nachricht aus
             counter -= 20L; //Wir ziehen dem Counter 20 Ticks ab
         } else {  //Der counter müsste 0 sein.
              counter = 200L; //Wir setzen den counter hoch für weitere Durchläufe
              task.cancel();  //Wir brechen den Task ab
         }
     }
}, 0L, 20L);

Wir haben also einen synchronen Task der obrige Anweisungen ausführt.

Ende! :D
 
Kennt jemand gute Tutorials um coden zu lernen? Also da ich auch sehen will was ich Code würd ich gern Minecraft Plugins schreiben oder kennt wer noch was anderes? Hab früher Lonzbonz geschaut aber naja... So wirklich viel hab ich nicht verstanden
 
Kennt jemand gute Tutorials um coden zu lernen? Also da ich auch sehen will was ich Code würd ich gern Minecraft Plugins schreiben oder kennt wer noch was anderes? Hab früher Lonzbonz geschaut aber naja... So wirklich viel hab ich nicht verstanden
Tipp: Fang mit java an. Konsole usw. Damit kommste weiter. Dann erst die APIs
 
Hi, ich bräuchte mal eure Hilfe undzwar bin ich grade bei an einem Nickplugin zu schreiben alles Funktioniert auf einem Bukkit Server doch da das Nicksystem über Bungeecord laufen soll geht es nicht bzw der Skin ändert sich nicht. Hättet ihr da ne Lösung?
 
Was meinst du mit Konsole?
Wie schon gesagt wurde, solltest du zuerst mit "rohem" Java beginnen, bevor du mit Spigot/Bukkit beginnst. Bukkit/Spigot sind Techniken die Java benutzen, es ist erforderlich Java zu können um Bukkit/Spigot Plugins zu schreiben. Man muss zuerst Autofahren lernen bevor man Formel 1 fahren lernen kann, das ist in etwa vergleichbar. Oder ein anderes Beispiel ist, dass du zuerst plus, minus, mal und durch rechnen können musst, bevor du Gleichungen lösen lernst.

Um Java zu lernen kann ich dir zwei Wege empfehlen.
  1. Lies dir ein Java-Lernbuch durch. Ich kann dir "Java ist auch eine Insel" sehr empfehlen, es ist ein sehr gutes Buch um Java zu lernen. Außerdem ist es auf Deutsch das mit Abstand populärste Buch um Java zu lernen.
  2. Schau dir ein Video-Tutorial an. Diese Methode ist nicht so gut wie die Buch-Methode. Jedoch ist die angenehmer und Zeitsparender. Falls du also diese Methode wählen willst empfehle ich dir das Tutorial von "Brotcrunsher". Es ist gratis auf YouTube zu finden. Es ist an komplette Programier-Anfänger gerichtet, du brauchst also kein Vorwissen.

Ich persönlich empfehle dir die erste Methode, da sie langfristig viel besser ist.

Bei beiden Methoden wirst du schnell herausfinden was "Konsole" bedeutet.

Wenn du dann Java einigermaßen kannst, bringt es etwas dir Lonzbonz-Tutorials anzuschauen.

Ich hoffe ich konnte dir mit diesem Post weiterhelfen :)

Aaronmacaron
 
[Only for Clients]

DebugBar (mit Informationen)

Code:
private void renderDebugBar() {

//Made by Fendtxerion

        Color bgColor = new Color(0.0f,0.0f,0.0f,0.5f);
        Color textColor = Color.RED;

        int bottom = Wrapper.mc.displayHeight / 2;
        int menuHeight = 30;

        RenderHelper.drawRect(0, bottom - menuHeight + 6, Wrapper.mc.displayWidth / 2, bottom, bgColor.getRGB());

        int slot = Wrapper.mc.thePlayer.inventory.currentItem + 1;
       
        String item;
       
        if(!(Wrapper.mc.thePlayer.getCurrentEquippedItem() == null)){
           
            item = Wrapper.mc.thePlayer.getCurrentEquippedItem().getDisplayName();
           
        }else{
           
            item = "Kein Item ausgewählt!";
           
        }
       
        int left1 = 10;
        int left2 = 580;
        int line1Top = bottom - menuHeight + 10;
        int line2Top = bottom - menuHeight + 20;
        String line1Text1 = "Koordinaten: §3§l" + (int) Wrapper.mc.thePlayer.posX + ", " + (int) Wrapper.mc.thePlayer.posY
                + ", " + (int) Wrapper.mc.thePlayer.posZ + " §6§l| §rFPS: §3§l" + Minecraft.debugFPS;
        String line1Text2 = "Slot §3§l" + slot + " §rausgewählt §6§l| §rItem: §3§l" + item;
        String line2Text1 = "Nutzername: §3§l" + Wrapper.mc.thePlayer.getName();
        String line2Text2;
        try {
            line2Text2 = "Server-Version: §3§l" + Wrapper.mc.getCurrentServerData().gameVersion;
        } catch (Exception ex) {
            line2Text2 = "Server-Version: §3§lKein Server gefunden!";
        }

       
        if(Wrapper.mc.currentScreen == null){
           
            Wrapper.fr.drawString(line1Text1, left1, line1Top, textColor.getRGB());
            Wrapper.fr.drawString(line1Text2, left1, line2Top, textColor.getRGB());
            Wrapper.fr.drawString(line2Text1, left2, line1Top, textColor.getRGB());
            Wrapper.fr.drawString(line2Text2, left2, line2Top, textColor.getRGB());
           
        }
    }
 
An alle die immer noch nach einem Anfang zum Programmieren-Lernen suchen: lest mal das Buch "Java ist auch eine Insel"!
Hat mir da sehr geholfen, und vermittelt das Grundwissen, was bei den YT-Tuts nicht so gut rüberkommt!
Youtube Tutorials sind meistens schlecht :P Ich hab mir überlegt ob ich sowas mache für fortgeschrittene c:
 
  • Like
Reaktionen: MrsUniverse
Youtube Tutorials sind meistens schlecht :p Ich hab mir überlegt ob ich sowas mache für fortgeschrittene c:

Ich lerne generell immer mit Büchern. C#, HTML und CSS nur mit Büchern gelernt/bzw. am lernen.
Und ich würde glaub ich nie auf YT umsteigen :D Aber was ganz gut währe, wenn kleinere speziellere Sachen erklärt werden. Z.B. (C#) verschiedene Steuerelemente, die natürlich nicht alle im Buch betrachtet werden können. Sowas wäre echt interessant :D Und in Java müsste es wahrscheinlich auch solche Sachen geben, die nicht unwichtig sind, aber nicht im (in jedem) Buch behandelt werden oder ? :D
 
Wie schon gesagt wurde, solltest du zuerst mit "rohem" Java beginnen, bevor du mit Spigot/Bukkit beginnst. Bukkit/Spigot sind Techniken die Java benutzen, es ist erforderlich Java zu können um Bukkit/Spigot Plugins zu schreiben. Man muss zuerst Autofahren lernen bevor man Formel 1 fahren lernen kann, das ist in etwa vergleichbar. Oder ein anderes Beispiel ist, dass du zuerst plus, minus, mal und durch rechnen können musst, bevor du Gleichungen lösen lernst.

Um Java zu lernen kann ich dir zwei Wege empfehlen.
  1. Lies dir ein Java-Lernbuch durch. Ich kann dir "Java ist auch eine Insel" sehr empfehlen, es ist ein sehr gutes Buch um Java zu lernen. Außerdem ist es auf Deutsch das mit Abstand populärste Buch um Java zu lernen.
  2. Schau dir ein Video-Tutorial an. Diese Methode ist nicht so gut wie die Buch-Methode. Jedoch ist die angenehmer und Zeitsparender. Falls du also diese Methode wählen willst empfehle ich dir das Tutorial von "Brotcrunsher". Es ist gratis auf YouTube zu finden. Es ist an komplette Programier-Anfänger gerichtet, du brauchst also kein Vorwissen.

Ich persönlich empfehle dir die erste Methode, da sie langfristig viel besser ist.

Bei beiden Methoden wirst du schnell herausfinden was "Konsole" bedeutet.

Wenn du dann Java einigermaßen kannst, bringt es etwas dir Lonzbonz-Tutorials anzuschauen.

Ich hoffe ich konnte dir mit diesem Post weiterhelfen :)

Aaronmacaron
Kann ich mit den Videos dann nur lernen oder könnte ich damit irgendwas coden was hilfreich wäre? :D Mit Minecraft kann ich ja noch nich anfangen ;)

Ich bin ein Profi xD

ZwtoId2.jpg
 
Zuletzt bearbeitet:
  • Like
Reaktionen: batthomas
Status
Für weitere Antworten geschlossen.

Soziale Medien

  • X
  • TikTok

Über uns

  • GommeHD.net ist einer der größten Minecraft-Server der Welt. Dir gefällt unser Server? Dann unterstütze uns durch einen Kauf im Shop!
  • Shop