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

Spigot Rangsystem

Firnen

Minecrafter
Registriert
25 Mai 2019
Beiträge
25
Diamanten
300
Hey ich sitze im Moment an einem Rangsystem. Dies Funktioniert und der Server nimmt das Plugin auch an. Die Ränge existieren ebenso. Über die Textdatei kann ich an einzelne Spieler Ränge verteilen. Bei dem Versuch einen Rang im Spiel zu vergeben kommen allerdings immer folgende Fehlermeldungen:

-Der Befehl /rank Spieler Rang wird von dem Server nicht erkannt, trotzdem kommt die Fehlermeldung.
-Der (Spieler) ist nicht online und dann noch das der Rang nicht existiert.

Vielleicht habe ich nur etwas beim schreiben vertauscht. Finde den Fehler allerdings nicht und weiß nicht was ich noch verändern kann, damit es funktioniert .
Ich hoffe das Ihr mir weiter helfen könnt.

Ps: Falls Ihr mir verraten könnt, wie ich einzelnen Klassen auch noch einzelne Permissions zuweisen kann, wäre ich euch echt dankbar.

Hier ein Teil des Codes:
Rang.PNG
 

Avankziar

Schafhirte
Registriert
12 Februar 2018
Beiträge
135
Alter
33
Diamanten
324
Minecraft
Avankziar
Naja, der Server erkennt es nicht als Command, da du hier ein EVENT nutzt!
Die Fehlermeldung dass, der Spieler nicht existiert, kommt, da das Event trotzdem getriggert wird...
Und der Spieler existiert nicht, weil du bei "target!=null" dadrunter auch eine Nachricht ausgibst, dass der Spieler nicht online ist... Also richtig blöd...
Und der Warum es nicht funktioniert ist, weil du beim rankName toLowerCase , aka Kleinschreibung machst, und danach nach einem bspw. "Admin" vergleichst. jedoch wird es wenn dann nur "admin" sein, was bei einer equal als falsch ausgegeben wird.
Also entweder equalsignoreCase verwenden, oder to lowercase nicht nehmen^^

P.S.: Beim nächsten mal bitte als Code reinschreiben^^ (So kann man bestimmte Stellen zitieren, ist leichter)
P.P.S.: Command einrichten nicht vergessen^^
 

Firnen

Minecrafter
Registriert
25 Mai 2019
Beiträge
25
Diamanten
300
Erstmal Danke für die schnelle Antwort. Werde deine Tipps gleich mal umsetzten. Ist mein erster Versuch ein etwas komplexeres Plugin zu schreiben. Bin halt noch ein relativer Neuling auf diesem Gebiet.
Zu dem Command. Würdest du mir empfehlen eine neue Klasse mit einem CommandExecutor zu verwenden oder gibt es einen eleganteren Weg?
 

Avankziar

Schafhirte
Registriert
12 Februar 2018
Beiträge
135
Alter
33
Diamanten
324
Minecraft
Avankziar
Der elegante Weg ist es, eine neue Klasse mit einem CommandExecutor zu verwenden ^^
Ist Übersichtlicher^^ (Vor allem wenn du zig commands hast, immer eine neue klasse nehmen. Mache ich auch bei fast allen Events, außer dann nicht, wenn sie zusammenhängen^^
Sowie was ich gerade mache, ein Jobplugin, wo ich bei 1 mb angekommen bin, dass wird sonst sehr unübersichtlich xD -.-)
 

Firnen

Minecrafter
Registriert
25 Mai 2019
Beiträge
25
Diamanten
300
Ein Jobplugin hört sich echt interessant an. Habe dies noch nie versucht. Schaffe es noch nicht mal ein anständiges Währungsplugin auf die Beine zu stellen -.-
Das dies leicht unübersichtlich wird glaube ich Dir nur zu gerne. Vor allem bei 1mb O_O.
 

Firnen

Minecrafter
Registriert
25 Mai 2019
Beiträge
25
Diamanten
300
Stelle hier mal alle Klassen rein, die ich für das Projekt erstellt habe. Ist glaube ich einfacher.

Main:

Java:
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin implements Listener{

    FileHandler FileHander = new FileHandler();
    PlayerHandler PlayerHandler = new PlayerHandler();
    Events Events = new Events(PlayerHandler);
   
    @Override
    public void onEnable() {
        getServer().getPluginManager().registerEvents(Events, this);
        FileHander.Setup();
       
        getCommand("rank <Name> <Rang>").setExecutor(new RangCommand());
   
    }
   
    @Override
    public void onDisable() {
   
    }  
}

PlayerHandler:
Java:
import java.io.File;
import java.io.IOException;

import org.bukkit.Bukkit;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.Team;

import net.md_5.bungee.api.ChatColor;

public class PlayerHandler {

    int ADMIN = 100;
    int DEVELOPER = 80;
    int SUPPORTER = 60;
    int BÜRGER = 40;
    int SPIELER = 0;
   
    public void SetupPlayer(Player p) {
      File f = new File("plugin/Ranksystem/PlayerData/" + p.getUniqueId() + ".yml");
      if(f.exists()) {
          try {
            f.createNewFile();
        } catch (IOException e) {          
            e.printStackTrace();
        }
      }
      YamlConfiguration yml = YamlConfiguration.loadConfiguration(f);
      yml.addDefault("Name", p.getName());
      yml.addDefault("Rank", SPIELER);
      yml.options().copyDefaults(true);
      try {
        yml.save(f);
    } catch (IOException e) {      
        e.printStackTrace();
    }
   }
   
    public boolean setRank(Player p, int rank) {
        File f = new File("plugin/Ranksystem/PlayerData/" + p.getUniqueId() + ".yml");
         YamlConfiguration yml = YamlConfiguration.loadConfiguration(f);
         yml.set("Rank", rank);
         try {
            yml.save(f);
        } catch (IOException e) {          
            e.printStackTrace();
            return false;
        }
         return true;
    }
   
    public int getRank(Player p) {
         File f = new File("plugin/Ranksystem/PlayerData/" + p.getUniqueId() + ".yml");
         YamlConfiguration yml = YamlConfiguration.loadConfiguration(f);
         return yml.getInt("Rank");
    }
   
    public String getRankPrefix(int Rank) {
        if(Rank == ADMIN) {
            return ChatColor.DARK_AQUA.toString() + ChatColor.BOLD + "Admin" + ChatColor.WHITE;      
            } else if(Rank == DEVELOPER) {
            return ChatColor.DARK_BLUE.toString() + ChatColor.BOLD + "Developer" + ChatColor.WHITE;
        } else if(Rank == SUPPORTER) {
            return ChatColor.GREEN.toString() + ChatColor.BOLD + "Supporter" + ChatColor.WHITE;
        } else if (Rank == BÜRGER) {
            return ChatColor.YELLOW.toString() + ChatColor.BOLD + "Bürger" + ChatColor.WHITE;
        } else                  
            return "";
            }
       
   
   
    public void refreshRanks() {
        for(Player p : Bukkit.getOnlinePlayers()) {
            Scoreboard board = Bukkit.getServer().getScoreboardManager().getNewScoreboard();
            for(Player pl : Bukkit.getOnlinePlayers()) {
                String prefix = getRankPrefix(getRank(pl));
                Team team = board.registerNewTeam(pl.getName());
                team.setPrefix(prefix);              
                team.addEntry(pl.getName());
               
               
            }
p.setScoreboard(board);
        }
        }
}

Events:


Java:
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.event.player.PlayerJoinEvent;

public class Events implements Listener {

    PlayerHandler PlayerHandler;
   
    public Events(PlayerHandler _PlayerHandler) {
        PlayerHandler = _PlayerHandler;
    }
   
   

    @EventHandler
    public void onPlayerJoin(PlayerJoinEvent e) {
         System.out.println(e.getPlayer().getName());
         Player p = e.getPlayer();
         PlayerHandler.SetupPlayer(p);
         PlayerHandler.refreshRanks();
    }
   
    @EventHandler
    public void onPlayerChat(AsyncPlayerChatEvent e) {
        e.setCancelled(true);
        Player p = e.getPlayer();
        String name = p.getName();
        String prefix = PlayerHandler.getRankPrefix(PlayerHandler.getRank(p));
        String message = e.getMessage();
        Bukkit.broadcastMessage(prefix + name + ": " + message);
       
    }
   
    @EventHandler
    public void onCommand(PlayerCommandPreprocessEvent e) {
        Player p = e.getPlayer();
        String[] args = e.getMessage().split(" ");
        String cmd = args[0].replace("/", "").toLowerCase();
        int rank = PlayerHandler.getRank(p);
        if(cmd.equals("rank")) {
            if(rank >= PlayerHandler.DEVELOPER) {                          
            e.setCancelled(true);
            if(args.length == 3) {
                String targetName = args[1];
                Player target = Bukkit.getPlayer(targetName);
                if(target.isOnline()) {
                    int rankValue = 0;                  
                    p.sendMessage("§cFehler:" + targetName + "§cist nicht online!");
                    String RankName = args[2].toLowerCase();
                    if(RankName.equals("Admin")) {
                        rankValue = PlayerHandler.ADMIN;
                    }else if(RankName.equals("Developer")) {
                        rankValue = PlayerHandler.DEVELOPER;
                    }else if(RankName.equals("Supporter")) {
                        rankValue = PlayerHandler.SUPPORTER;
                    } else if(RankName.equals("Bürger")) {
                        rankValue = PlayerHandler.BÜRGER;
                    }else if(RankName.equals("Spieler")) {
                        rankValue = PlayerHandler.SPIELER;
                    }else {
                        rankValue = -1;
                    }
                    if(rankValue >= 0) {
                        if(rankValue < rank) {
                            if(PlayerHandler.getRank(target) < rank) {
                                if(PlayerHandler.setRank(target, rankValue)) {
                                    p.sendMessage(target.getName() + " §ahat erfolgreich den" + RankName +"§aRang erhalten!");  
                                    target.sendMessage("§aDein Rang neuer Rang ist nun der " + RankName + "§aRang!");
                                    PlayerHandler.refreshRanks();
                                }
                                }else {
                                p.sendMessage("§cAchtung! Du kannst keine Ränge verändern, die höher pder gleich zu deinem sind.");
                            }
                        }else {
                            p.sendMessage("§c Achtung! Du kannst keine Ränge vergeben die gleich oder höher sind als deiner!");
                        }
                    }else {
                        p.sendMessage("§CFehler: " + RankName + "  §cist kein Rang!");
                    }
                } else {
                    p.sendMessage("§cFehler:  " + targetName + " §cist nicht online");
                }
            } else {
                p.sendMessage("§cBenutze /rank <player> <Rang>");
            }
        }
        }
    }
}

und die Command Klasse:


Java:
import org.bukkit.Bukkit;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

public class RangCommand implements CommandExecutor {

   

    @Override
    public boolean onCommand(CommandSender sender, org.bukkit.command.Command cmd, String label, String[] args) {
        if (sender instanceof Player) {
            Player player = (Player) sender;
            if(player.hasPermission("Rang")) {
                if(args.length == 2) {
                   
                    Player target = Bukkit.getPlayer(args[0]);
                    if (target == null) {
                        player.sendMessage("§cDieser Spieler ist zur Zeit nicht online");
                        return true;
                    }
                   
                   
                }else
                    player.sendMessage("§cBitte benutze den Befehl §6/rank Name Rang!");
               
            } else
                player.sendMessage("§cDazu hast du keine Rechte!");
        }
       
        return false;
    }

}
 
Zuletzt bearbeitet von einem Moderator:

Avankziar

Schafhirte
Registriert
12 Februar 2018
Beiträge
135
Alter
33
Diamanten
324
Minecraft
Avankziar
Java:
getCommand("rank <Name> <Rang>").setExecutor(new RangCommand());
bitte zu
Java:
getCommand("rank").setExecutor(new RangCommand());
ändern, denn ein Command ist nur "rank", der rest sind Argumente!!

und du hast die plugin.yml vergessen rein zu tun
 
Zuletzt bearbeitet von einem Moderator:

Avankziar

Schafhirte
Registriert
12 Februar 2018
Beiträge
135
Alter
33
Diamanten
324
Minecraft
Avankziar
und eventuell deinen Pfad überdenken, wenn du nämlich mehere Plugins schreibst, und die alle mit
Java:
de.firnen.server.main.Main
anfangen, würde das zu konfikten führen.
Da dein Plugin ein Rangsystem ist, besser sowas wie:
Java:
de.firnen.rangsystem.main.Main
oder so nennen

ok, auch die plugin.yml ist eher "ungut" aufgebaut.
lieber so: (mal von meinen plugins^^)
YAML:
main: de.avankziar.debug.Debug
version: 1.0.0
name: Debug
author: Avankziar
description: A Debug Plugin
commands:
  debug:
    description: A debug Command
 

Firnen

Minecrafter
Registriert
25 Mai 2019
Beiträge
25
Diamanten
300
Bekomme inzwischen nur noch diese Fehlermeldung:

Code:
java.lang.NullPointerException: null
        at de.firnen.server.main.Main.onEnable(Main.java:20) ~[?:?]
        at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:263) ~[spigot.jar:git-Spigot-093165d-ba575a5]
        at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:352) [spigot.jar:git-Spigot-093165d-ba575a5]
        at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:416) [spigot.jar:git-Spigot-093165d-ba575a5]
        at org.bukkit.craftbukkit.v1_14_R1.CraftServer.enablePlugin(CraftServer.java:458) [spigot.jar:git-Spigot-093165d-ba575a5]
        at org.bukkit.craftbukkit.v1_14_R1.CraftServer.enablePlugins(CraftServer.java:372) [spigot.jar:git-Spigot-093165d-ba575a5]
        at net.minecraft.server.v1_14_R1.MinecraftServer.a(MinecraftServer.java:440) [spigot.jar:git-Spigot-093165d-ba575a5]
        at net.minecraft.server.v1_14_R1.DedicatedServer.init(DedicatedServer.java:258) [spigot.jar:git-Spigot-093165d-ba575a5]
        at net.minecraft.server.v1_14_R1.MinecraftServer.run(MinecraftServer.java:761) [spigot.jar:git-Spigot-093165d-ba575a5]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_211]
 
Zuletzt bearbeitet von einem Moderator:

Avankziar

Schafhirte
Registriert
12 Februar 2018
Beiträge
135
Alter
33
Diamanten
324
Minecraft
Avankziar
Fehlerlesen können hilft^^

Code:
at de.firnen.server.main.Main.onEnable(Main.java:20) ~[?:?]
das bedeutet, in deiner Main Klasse, in der Zeile 20 ist ein Nullpointer Fehler. Nun was steht mitlerweile an dieser stelle?

P.S.: Bei fehlern immer den aktuellen Code der Klasse mitgeben^^
 

Avankziar

Schafhirte
Registriert
12 Februar 2018
Beiträge
135
Alter
33
Diamanten
324
Minecraft
Avankziar
Nee, da sehe ich keine Fehler,
was mir aber komisch vorkommt sind die Zeilen in der Main Klasse
Code:
    FileHandler FileHander = new FileHandler();
    PlayerHandler PlayerHandler = new PlayerHandler();
    Events Events = new Events(PlayerHandler);
    getServer().getPluginManager().registerEvents(Events, this);

vorallem die letzte Zeile, normalerweise registriert man so:
Code:
getServer().getPluginManager().registerEvents(new Events(), this);
im Übrigen, würde ich eine Listenerklasse niemals einfach nur Events nennen ;)
 

Firnen

Minecrafter
Registriert
25 Mai 2019
Beiträge
25
Diamanten
300
So wie du dies registrierst, registriere ich nur Listener:

Code:
PluginManager pluginManager = Bukkit.getPluginManager();
        pluginManager.registerEvents(new JoinListener(), this);
        pluginManager.registerEvents(new DeathListener(), this);
        pluginManager.registerEvents(new QuitListener(), this);
 
Oben