• 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 Hashmap erkennt nicht?

ChisleLP

Schafhirte
Registriert
17 Oktober 2013
Beiträge
103
Diamanten
2
Minecraft
ChisleLP
Tach,

Nachdem ich mein 1. Plugin erfolgreich programmiert hab, mache ich nun 2. Plugin... diesemal hab ich schwerigkeiten mit hashmap...

Ich habe einen Functions mit Long Hashmap aus ein Youtuber geholt. da es dann einfacher ist für mich. nun ist mein problem, das der irgendwie nicht erkennt...

Main.java:
public static Functions lmap = new Functions();
Dies rufe ich aus Main.java (Dies ist ein Long HashMap

Functions.java:
public class Functions {
 
    public static HashMap<Object, Object[]> menudata;
    Object[] values;
 
    public Functions() {
        values = new Object[999];
        menudata = new HashMap<Object, Object[]>();
    }
 
    public void setValue(Object saveObject, int position, Object value) {
        values = menudata.containsKey(saveObject) ? menudata.get(saveObject) : new Object[999];
        values[position] = value;
        menudata.put(saveObject, values);
    }

    public void setValues(Object saveObject, Object... value) {
        values = value;
        menudata.put(saveObject, values);
    }

    public Object[] getValues(Object saveObject) {
        values = menudata.containsKey(saveObject) ? menudata.get(saveObject) : new Object[999];
        return menudata.containsKey(saveObject) ? values : null;
    }

    public Object getValue(Object saveObject, int position) {
        values = menudata.containsKey(saveObject) ? menudata.get(saveObject) : new Object[999];
        return (!(position > getValues(saveObject).length)) && menudata.containsKey(saveObject) ? getValues(saveObject)[position] : null;
    }
}

Und mein problem ist: nachdem ich die "hasmap" gesetzt habe. und nacher in ein andere Functions versucht zu abzurufen, erkennt er nicht...
Menu.java:
public class Menu implements Listener {
 
 
    public static void onStart() throws IOException {
        System.out.println("Inventory Setting up!");
        File x = new File("plugins//"+Main.getPlugin().getName()+"//Quests/Menu.yml");
        YamlConfiguration xs = YamlConfiguration.loadConfiguration(x);
     
        Main.lmap.setValues("Inventory", xs.get("Inventory.Name"), xs.get("Inventory.row"));
     
        System.out.println(Main.lmap.getValue("Inventory", 0));

        //Meheres code für Check files und so.

        System.out.println(Main.lmap.getValue("Inventory",0));
    }
    public static void openInventoryMenu(Player p) {
        System.out.println(Main.lmap.getValue("Inventory", 0));
    }
}
Bei line 11, 15 Spuckt er aus was auch sein sollte, dann bei Line 18 spuckt er "null"...

Console:
Code:
[14:40:50 INFO]: Inventory Setting up!
[14:40:50 INFO]: º3Challenge ºb- º6SkyBlock
[14:40:50 INFO]: º3Challenge ºb- º6SkyBlock
[14:40:50 INFO]: Server permissions file permissions.yml is empty, ignoring it
[14:40:50 INFO]: Done (3,659s)! For help, type "help" or "?"
[14:41:35 INFO]: UUID of player ChisleLP is 49c6b4b3-1c0d-33f4-a962-d152fa5b5018
[14:41:35 INFO]: ChisleLP[/127.0.0.1:59952] logged in with entity id 352 at ([world]-36.87268052819627, 77.59971754238934, 297.308549637423)
[14:41:48 INFO]: ChisleLP issued server command: /challenge
[14:41:48 ERROR]: null
 
Zuletzt bearbeitet:

ChisleLP

Schafhirte
Registriert
17 Oktober 2013
Beiträge
103
Diamanten
2
Minecraft
ChisleLP
Zunächst einmal solltest du diese Functions-Klasse nicht benutzen. Wer auch immer die geschrieben hat, ist absolut unfähig - static wird unnötigerweise genutzt, übergroße Arrays werden zugewiesen, das values-Feld macht auch keinen Sinn und da die Map einfach einen nicht näher definierten Object-Array zurückgibt, wirst du damit in Zukunft noch massive Probleme haben.
Es wäre also besser, dir eine passendere Datenstruktur zu überlegen. Da du scheinbar Inventare speichern und laden willst, könntest du zum Beispiel entweder direkt ein Inventory erstellen, oder zumindest mit den Daten aus der Config ein InventoryData-Objekt erzeugen, in dem du dann Namen und Items (als ItemStack-Array) speicherst. Diese kannst du dann z.B. in einer Map<String, InventoryData> speichern - dann hast du auch ohne Downcasting direkt den richtigen Typ als Rückgabewert.

Was den Fehler selbst angeht: In welcher Reihenfolge bzw. an welcher Stelle werden denn onStart() und openInventoryMenu() ausgeführt? Es wäre ganz nützlich, mal deine Main-Klasse zu sehen. Du solltest auch überprüfen, ob unter Umständen an anderer Stelle die Inhalte der Map verändert werden.
Danke,

Aber da ich nicht das für "inventory speichert" sondern ich wollte das man in YML einstellen kann welche Items, Name, lore usw. für die "Menü" benutze.

Außerdem ich weiß, das ich nachher Probleme habe wenn ich die Long Hash map benutze, aber ich hab das schon mit mein 1. Plugin auch schon hingekriegt. Nun will ich ja nur das die Output auch richtig funkoniert... Bloß ich weiß leider nicht worran es liegt.

Es werden erst "onEnable()" von Main gestartet, und dann die onStart() functions werden abgerufen. Und die letze waren für die "commands".

Hier mal die Mains Code
Code:
public class Main extends JavaPlugin {
   
    public static Functions lmap = new Functions();
    public static Main plugin;
   
    public void onEnable() {
        plugin = this;
        System.out.println("[Challenges] Aktiviert.");
       
        try {
            Menu.onStart();
        } catch (IOException e) {
            e.printStackTrace();
        }
        getCommand("challenge").setExecutor(new Challeng());
       
        PluginManager pluginMananger = Bukkit.getPluginManager();
        pluginMananger.registerEvents(new Listnener(), this);
        pluginMananger.registerEvents(new Menu(), this);
    }
    public void onDisable() {
        System.out.println("[Challenges] Deatkviert.");
    }
    public static JavaPlugin getPlugin() {
        return plugin;
    }
}

Darf ich im Sinne der Wissenschaft darum bitten, dass du mit uns das Youtubevideo teilst, aus dem du diesen Code kopiert hast? Du würdest mir damit wirklich einen riesen Gefallen tun.
Sicher,
 

ChisleLP

Schafhirte
Registriert
17 Oktober 2013
Beiträge
103
Diamanten
2
Minecraft
ChisleLP
Challeng.Java:
public class Challeng implements CommandExecutor {

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if (sender instanceof Player) {
            Player player = (Player) sender;
            if (player.hasPermission("Challenge.GUI")) {
                if (args.length == 0) {
                    Menu.openInventoryMenu(player);
                } else if (args.length == 1) {
                    player.sendMessage("§cBitte benutze nur §b/challenge");
                }
            } else {
                player.sendMessage("§cDu hast leider keine Rechte!");
            }
        } else {
            System.out.println("§cDieser befehl kannst du per Spieler ausführen lassen.");
        }
        return false;
    }
}

Ich überlege gerade anders zu gestalten, aber hab kein vorstellung wie ich das dann machen mit mehere Menü.
 

ChisleLP

Schafhirte
Registriert
17 Oktober 2013
Beiträge
103
Diamanten
2
Minecraft
ChisleLP
Vielen danke für die Erklärung,

Ich werde mir mal nächste mal versuchen, weniger static zu nutzen.

Vielleicht sollte ich auch etwas mehr von Java lernen, denn ich kenne mich nicht so gut mit "this." aus. ^^

Danke nochmal.
 

ChisleLP

Schafhirte
Registriert
17 Oktober 2013
Beiträge
103
Diamanten
2
Minecraft
ChisleLP
Danke,
Ich bin kein "Anfänger" in programmieren berreich da ich schon längere mit Lua angefangen habe, was eigentlich ganz einfache Sprache ist, später habe ich dann Python gelernt... ich weiß nicht ob HTML/CSS/PhP für euch auch ein "programmier Sprache" ist, gelernt... und jetzt dachte ich mir da ich ab und zu Minecraft spiele, und Programmieren halt mein Hobbys ist, hab ich mir vor nen woche angefangen zu "Spigot" ohne vorher java zu lernen.

Danke ich werde die 2 Topic mal lesen.
 
Oben