• 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!

Plugin Problem bei editierbaren SG Kisten Plugin

KingCopyHD

Minecrafter
Registriert
8 September 2019
Beiträge
29
Diamanten
300
Hey Leute ich habe ein Problem mit einem Plugin ich programmiere noch nicht so lange und schaue deshalb viele Tutorials und schreibe sie eigentlich nur ab und bei einem Plugin hab ich ein Problem. Es ist ein Sg Kisten plugin mit random Inhalt und mann kann ihn über die config ändern mit chance , Items und wieviel davon hier der SourceCode:

1567930063605.png



1567930092275.png



1567930113543.png



Hier meine Main:


1567930136575.png




1567930147731.png



Hier die Fehlermeldung wenn ich versuche denn Redstoneblock anzuklicken:

1567930223882.png



und hier die Config:

1567930254467.png



Ich weiss es ist sehr viel aber bitte bitte ich brauche dabei echt Hilfe!
 
Registriert
10 Dezember 2017
Beiträge
161
Alter
26
Diamanten
322
Minecraft
DerFrZocker
Bitte benutze in Zukunft die Code Tags [.CODE=java]Dein Code[./CODE] (Ohne die Punkte). anstelle von Bilder, das macht es einfacher den Code zu zitieren und durch zu schauen.

Zu deinen Problem, schaue dir nochmal deine loadConfig() methode an und vergleiche es mit der Fehler Meldung, sowie deiner Split Methode im ChatListener.
 

JTK222

Threadripper
Registriert
5 September 2013
Beiträge
1.150
Diamanten
323
Minecraft
JTK222
*seufz* Es ist schön wenn du durch Bilder besser lernen kannst, aber zur Fehler suche sind diese kompletter müll.
Wobei, anders als DerFrZocker würde ich Pastebin/Hastebin empfehlen,
da code blöcke auch schnell unübersichtlich werden außer du postest kleine code abschnitte.

Und nun zu deinem fehler
1567932206660.png

Die zahl hinter "ChestListener.java:71" ist übrigens die zeilen nummer.
Mit den beiden unterstrichenen zeilen solltest du eigentlich den fehler finden können.
 
Registriert
10 Dezember 2017
Beiträge
161
Alter
26
Diamanten
322
Minecraft
DerFrZocker
Wobei, anders als DerFrZocker würde ich Pastebin/Hastebin empfehlen,
da code blöcke auch schnell unübersichtlich werden außer du postest kleine code abschnitte.
Stimmt Pastebin/Hastebin gibt es auch noch, daran habe ich nicht gedacht. Ist bei der menge wirklich die bessere Entscheidung.
 

KingCopyHD

Minecrafter
Registriert
8 September 2019
Beiträge
29
Diamanten
300
ok tut mir leid mache ich nächstes mal besser , danke für eure Hilfe!
--
aber wie gesagt ich kenne mich damit 0 aus und checke uach von der Fehler Meldung nichts
Das hier ist Zeile 71 wie in der Fehlermeldung angezeigt: amount = Integer.valueOf(array[1]);
da sehe ich halt auch keinen Fehler und das darüber check ich auch nd soll ich bei einem String jetzt die zwei einsen rein schreiben oder wie sorry falls ich mich gerade sehr dumm anstelle aber ich bin echt noch nicht so lange dabei
--
So ich habe jetzt mal was geändert jetzt steht in der Console anstatt: Caused by: java.lang.NumberFormatException: For input string: "1 1"
das: Caused by: java.lang.NumberFormatException: For input string: ""
 
Zuletzt bearbeitet von einem Moderator:
Registriert
10 Dezember 2017
Beiträge
161
Alter
26
Diamanten
322
Minecraft
DerFrZocker
So ich habe jetzt mal was geändert jetzt steht in der Console anstatt: Caused by: java.lang.NumberFormatException: For input string: "1 1"
das: Caused by: java.lang.NumberFormatException: For input string: ""
Es wäre hilfreich zu wissen was du geändert hast. Du kannst dir auch mal die einzelne werde ausgeben. Und überprüfen ob diese stimmen. z.b. Den String bevor du ihn splittest und danach.
 

KingCopyHD

Minecrafter
Registriert
8 September 2019
Beiträge
29
Diamanten
300
Ich habe gerade gar keine Ahnung ich versuche es irgendwie aber verstehen tue ich es nicht und ich glaube das ich es lassen sollte ich höre mal so was ihr sagt

Wie gebe ich mir diese werde (meintest wahrscheinlich werte) aus

soll ich denn Code hier mal rein schicken?
 
Registriert
10 Dezember 2017
Beiträge
161
Alter
26
Diamanten
322
Minecraft
DerFrZocker
Wie gebe ich mir diese werde (meintest wahrscheinlich werte) aus
ganz einfach so: System.out.println(all);, System.out.println(array.lenght);, System.out.println(array[0]);, System.out.println(array[1]); usw.

Und dann überprüfst du ob die werte wo du dort angezeigt bekommst stimmen können.
 

KingCopyHD

Minecrafter
Registriert
8 September 2019
Beiträge
29
Diamanten
300
ok einfach alles mal ausgeben

hmm... im grunde kann ich mir ja das nur ausgeben lassen wenn diese Werte vorhanden sind und an der Stelle wo sie erstellt wurden ist ja keine Aktion vorhanden also wie gebe ich mir das aus?

Das ist für mich hier gerade echt schwierig ich möchte doch eigentlich nur Kisten mit random Inhalt :C , XD
 

Avankziar

Schafhirte
Registriert
12 Februar 2018
Beiträge
135
Alter
33
Diamanten
324
Minecraft
Avankziar
Ganz am Anfang, war dein Fehler ein Parse Fehler, denn du versuchst aus "1 1" eine Zahl zu machen, was nicht geht. Danach hast du wieder den gleichen Fehler, nur nun ist dein String leer, den du versuchst zum integer zu machen. Ich würde also mal dein ganzes Array überprüfen. Bzw. deine eigene Notation verrät es:
"//ID: subID, amount, chance"

Was du aber machst ist, das Array nach ":" zu spliten. Wenn du jedoch alle vier werte haben willst, kannst du nach dem jetztigen Schema nicht ":" nehmen, da du sonst nur 2 Werte "ID" und " subID, amount, chance" bekommen würdest. und wie du siehst wäre im 2 Teil halt noch Leertzeichen und Kommas drin, was das Parsen auf Integer unmöglich macht.

Deshalb änder deine Speicherfunktion, sowie deine Abruffunktion in bspw. sowas:
"ID;subID;amount;chance" und mache dann String[] array = all.split(";");

Verstanden?^^
 
Registriert
10 Dezember 2017
Beiträge
161
Alter
26
Diamanten
322
Minecraft
DerFrZocker
hmm... im grunde kann ich mir ja das nur ausgeben lassen wenn diese Werte vorhanden sind und an der Stelle wo sie erstellt wurden ist ja keine Aktion vorhanden also wie gebe ich mir das aus?
Dein code stopt / crasht bei zeile 71 des ChatListeners ein Zeile davor erstellts du die array mit split, dass heist du kannst dir problemlos den inhalt der array ausgeben lasse. Sowie den String all.

Das ist für mich hier gerade echt schwierig ich möchte doch eigentlich nur Kisten mit random Inhalt :C , XD
Da musst du durch. Es wäre zu einfach dir direkt zu sagen wo und was der Fehler ist. Du sollst auch lernen wie du solche Fehler selbständig auswertest und löst. Ansonsten wirst du es nie lernen und wegen jeder Kleinigkeit auf Hilfe angewiesen sein. An sich ist dein Fehler ein Leichtsinn / Flüchtigkeit Fehler. (nicht böse gemeint)
 

KingCopyHD

Minecrafter
Registriert
8 September 2019
Beiträge
29
Diamanten
300
Ja DerFrZocker da hast du schon recht und ich glaube das ich es vielleicht einfach lassen sollte ich versuche jetzt noch das was Avankziar gesagt hat ich ändere denn split zu(";") und schaue mal irgendwie checken tu ich hier nix deswegen muss ich wahrscheinlich was einfacheres machen trotzdem danke :D
 

SirYwell

PlotSquared Entwickler
Registriert
30 Juni 2017
Beiträge
540
Diamanten
488
Minecraft
SirYwell
Ich verstehe schon überhaupt nicht, warum die ganzen Daten in einer Zeile gespeichert werden sollen. Wie du vermutlich gemerkt hast, bereitet dir das jede Menge (unnötige) Probleme, da du ja eine YAML-Datei hast, die von Bukkit schon wunderbar eingelesen wird. Dir werden sämtliche Werkzeuge bereitgestellt, dass du dich NICHT um das Auslesen der Datei kümmern musst, also mach dir doch das Leben nicht unnötig schwer. Bei den Koordinaten schreibst du ja auch nicht alles in eine Zeile... (du kannst Koordinaten übrigens noch einfacher abspeichern, einfach über config.set("Lobby", location) und auslesen mit Location Location = (Location) config.get("Lobby"))

Also, vielleicht solltest du versuchen, dein Problem nicht unnötig zu verkomplizieren, sondern die verfügbaren Werkzeuge einfach nutzen.
 

KingCopyHD

Minecrafter
Registriert
8 September 2019
Beiträge
29
Diamanten
300
ja man ich verstehe ja schon das einfachste nicht ihr könnt das alles so gut und der Tipp von Avankziar ist anscheinend für mich auch schon zu schwer weil ich es irgendwie nicht hinbekomme anscheinen setzte ich das alles falsch ein ich habe keine ahnung was jetzt weg soll und was hin soll ich bin anscheinend einfach zu dumm dafür und ich denke nicht das das falsch ist was ihr sagt baer naja :CCCCC
 

Avankziar

Schafhirte
Registriert
12 Februar 2018
Beiträge
135
Alter
33
Diamanten
324
Minecraft
Avankziar
Dann poste einfach den aktuellen Code per Pastbin mal rein. Dann kann man besser drüber schauen und zitieren und wenn auch nötig, verbessern.
(Den ganzen Code, aka auch die Stelle, wo etwas in die Config geschrieben wird, sofern das nicht extern per hand gemacht wird...)
 

KingCopyHD

Minecrafter
Registriert
8 September 2019
Beiträge
29
Diamanten
300
So habe jetzt mal alles auf Anfang gesetzt das hier ist meine Main:
Javascript:
package de.Jason.Skywars.main;

import java.util.ArrayList;
import java.util.List;

import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;

import de.Jason.Skywars.commands.ReportCommand;
import de.Jason.Skywars.commands.SetupCommand;
import de.Jason.Skywars.commands.StartCommand;
import de.Jason.Skywars.commands.SupportCommand;
import de.Jason.Skywars.gamestates.GameState;
import de.Jason.Skywars.gamestates.GameStateManager;
import de.Jason.Skywars.listener.ChestListener;
import de.Jason.Skywars.listener.PlayerLobbyConnectionListener;

public class Main extends JavaPlugin {
    
    public static final String PREFIX = "§b§lSky§d§lWars §f| §r",
                               NO_PERMISSION = PREFIX + "§cDazu fehlen dir die Permissions";
    
    private GameStateManager gameStateManager;
    private ArrayList<Player> players;
    
    @Override
    public void onEnable() {
        gameStateManager = new GameStateManager(this);
        players = new ArrayList<>();
        
        gameStateManager.setGameState(GameState.LOBBY_STATE);
                
        init(Bukkit.getPluginManager());
        System.out.println("[SkyWars]: Das Plugin wurde gestartet!");
        
        loadConfig();
    }
    
    private void init(PluginManager pluginManager) {
        getCommand("setup").setExecutor(new SetupCommand(this));
        getCommand("start").setExecutor(new StartCommand(this));
        getCommand("support").setExecutor(new SupportCommand(this));
        getCommand("report").setExecutor(new ReportCommand(this));
        
        pluginManager.registerEvents(new PlayerLobbyConnectionListener(this), this);
        this.getServer().getPluginManager().registerEvents(new ChestListener(this), this);
    }
    
    @Override
    public void onDisable() {
        System.out.println("[SkyWars]: Das Plugin wurde beendet!");
    }
    
    public GameStateManager getGameStateManager() {
        return gameStateManager;
    }
    
    public ArrayList<Player> getPlayers() {
        return players;
    }
    
    private void loadConfig() {
        getConfig().options().copyDefaults(true);
        
        List<String> values = getConfig().getStringList("values");
        
        //ID:subID, amount, chance
        
        values.add("264:0,1 1");
        values.add("261:0,1 1");
        values.add("267:0,1 1");
        getConfig().set("values", values);
        
        saveConfig();
    }

}

Und das hier ist mein ChestListener:

Javascript:
package de.Jason.Skywars.listener;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;

import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;

import de.Jason.Skywars.main.Main;


public class ChestListener implements Listener {
        
    private Main plugin;

    public ChestListener (Main plugin) {
        this.plugin = plugin;
    }
    
    //RESSOURCES
    public HashMap<Location, Inventory> sgchests = new HashMap<>();
    
    @EventHandler   
    public void onInteract(PlayerInteractEvent e) {
        Player p = e.getPlayer();
        
        if(e.getAction() == Action.RIGHT_CLICK_BLOCK) {
            if(e.getClickedBlock().getType() == Material.REDSTONE_BLOCK) {
                Location loc = e.getClickedBlock().getLocation();
                
                if(sgchests.containsKey(loc)) {
                    p.openInventory(sgchests.get(loc));
                    return;
                } else {
                    
                    Random r = new Random();
                    int l = r.nextInt(15);
                    
                    Inventory inv = Bukkit.createInventory(null, InventoryType.CHEST);
                    List<ItemStack> items = new ArrayList<>();
                    
                    for(String all : plugin.getConfig().getStringList("values")) {
                        int ID     = 0;
                        int subID  = 0;
                        int amount = 0;
                        int chance = 0;
                        
                        //ID : subID, amount, chance
                        
                        if(all.contains(":")) {
                            String[]array= all.split(":");
                            ID = Integer.valueOf(array[0]);
                            String a = array[1];
                            a = a.substring(0, 1);                           
                            subID = Integer.valueOf(a);
                        }
                        
                        String[]array = all.split(", ");
                        amount = Integer.valueOf(array[1]);
                        chance = Integer.valueOf(array[2]);
                        
                        for(int i = 0; i < chance; i++) {
                            items.add(new ItemStack(ID, amount, (short) subID));
                        }
                        
                    }
                    
                    while(l != 0) {
                        l--;
                        
                        Random r2 = new Random();
                        
                        Random r3 = new Random();
                        
                        int n2 = r2.nextInt(27);
                        
                        int n3 = r3.nextInt(items.size());
                        
                        inv.setItem(n2, items.get(n3));
                    }
                    
                    sgchests.put(loc, inv);
                    p.openInventory(sgchests.get(loc));
                    return;
                    
                }
                
            }
        }
    }
 }
 

Avankziar

Schafhirte
Registriert
12 Februar 2018
Beiträge
135
Alter
33
Diamanten
324
Minecraft
Avankziar
Also als erstes schauen wir uns deine Save methode an, bzw. wie du die Werte in die Config schreibst:
Javascript:
package de.Jason.Skywars.main;
  
    private void loadConfig() {
        getConfig().options().copyDefaults(true);
      
        List<String> values = getConfig().getStringList("values");
      
        //ID:subID, amount, chance <= ist nicht korrekt, wenn du etwas nach split(""); machen möchtest, musst du alle werte durch EIN Symbol trennen

       //ID;subID;amount;chance wäre so korrekt
      
        values.add("264;0;1;1");        <= So sollte das dann hier aussehen
        values.add("261;0;1;1");
        values.add("267;0;1;1");
        getConfig().set("values", values);
      
        saveConfig();
    }

}

Und dann musst du es noch in der "Getter Methode" richtig rausholen.
Und das hier ist mein ChestListener:

Code:
                    for(String all : plugin.getConfig().getStringList("values")) {
                        int ID     = 0;
                        int subID  = 0;
                        int amount = 0;
                        int chance = 0;
                      
                        //ID;subID;amount;chance    <= Auch verbessert, weil wir können nur was herausnehmen, wie wir das eingespeichert haben
                      
                        if(all.contains(",")) {
                            String[] array= all.split(";");
                            if(array.size!=4)
                            {
                            return;
                            }
                            ID = Integer.valueOf(array[0]);
                            String a = array[1];
                           // a = a.substring(0, 1);                      <= Das hier macht keinen sinn mehr ^^   
                            subID = Integer.valueOf(a);
                            amount = Integer.valueOf(array[2]);
                            chance = Integer.valueOf(array[3]); 
                        }
                      
                      //  String[]array = all.split(", ");              <= persönlich sehe ich das als Kritisch an, aus dem Selben String, ohne veränderten wert, nochmal ein String Array zu holen.... daher ist hier der Code nicht mehr valide^^
                        //amount = Integer.valueOf(array[1]);
                        //chance = Integer.valueOf(array[2]);                      
                    }
                }
              
            }
        }
    }
}

Ich hoffe ich alles gefunden und beantwortet, warum und wieso man dass so macht. klar, mann könnte das generell anderes aufziehen, aber sowelche Methoden erforden dann immer ein bisschen mehr Wissen, daher belassen wird das mal dabei^^
 
Oben