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

Error bei selbstprogrammiertem Java Plugin

Status
Für weitere Antworten geschlossen.

Nils070697

Braumeister
Registriert
2 Juni 2012
Beiträge
347
Diamanten
0
Hey Leute ich habe mich nun an das programmieren von eigenen Plugins gesetzt doch nun taucht plötzlich ein mir unerklärlicher Fehler auf.
Eclipse zeigt weder Errors noch Warnungen an...
Ich hoffe ihr könnt mir helfen!

Datein:
SimpleArmor.java
Code:
package me.Nils070697.SimpleArmor;

import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;

public class SimpleArmor extends JavaPlugin{
	
	PluginManager manager = this.getServer().getPluginManager();

	@Override
	public void onDisable() {
		
		PluginDescriptionFile descFile = this.getDescription();
		System.out.println("[" + descFile.getName() + "]" + descFile.getName() + "wurde deaktiviert");
	
	}
	
	@Override
	public void onEnable() {
		
		PluginDescriptionFile descFile = this.getDescription();
		System.out.println("[" + descFile.getName() + "]" + descFile.getName() + " wurde aktiviert");
		System.out.println("[" + descFile.getName() + "] Version: " + descFile.getVersion());
		System.out.println("[" + descFile.getName() + "] Programmiert von " + descFile.getAuthors());
	
	}
	
	public boolean onCommand(CommandSender sender, Command cmd, String cmdLabel, String[] args){
		PluginDescriptionFile descFile = this.getDescription();
		boolean erfolg = false;
		
		Player p = (Player)sender;
		
		// Kommando "/armor"
		if(cmd.getName().equalsIgnoreCase("armor")){
			if(args.length == 0){
				
				// Diaruessi
				p.getInventory().setHelmet(new ItemStack(310));
				p.getInventory().setChestplate(new ItemStack(311));
				p.getInventory().setLeggings(new ItemStack(312));
				p.getInventory().setBoots(new ItemStack(313));
				// Diaschwert
				p.getInventory().addItem(new ItemStack(276, 1));
				
				p.sendMessage(ChatColor.RED + "[" + descFile.getName() + "]" + ChatColor.AQUA + "Du hast eine Diamantenruestung und ein Diamantenschwert bekommen!");
				erfolg = true;
				
			}
			else {
				
				erfolg = false;
				
			}
			
		}
			
			// Kommando "/SimpleArmor"
			if(cmd.getName().equalsIgnoreCase("SimpleArmor")){
				if(args.length == 0){
					
					p.sendMessage(ChatColor.AQUA + "----------" + ChatColor.RED + "SimpleArmor Kommandoliste" + ChatColor.AQUA + "----------");
					p.sendMessage(ChatColor.RED + "/armor" + ChatColor.AQUA + "  Gibt dir eine Diamantenrüstung und ein Diamantenschwert.");
					
					erfolg = true;
					
				}
				else {
					
					erfolg = false;
				
				}
			
			}
		
		return erfolg;
	}
	

	
}


Plugin.yml:
Code:
name: SimpleArmor
version: 1.0
main: me.Nils070697.SimpleArmor.SimpleArmor
author: Nils070697
website: maggicraft.de.gg
commands:
     SimpleArmor:
          description: Zeigt alle Befehle
          usage: /<command>
     armor:
          description: Gibt Ruestung
          usage: /<command>


Fehlerlog:
Code:
15:47:29 [SCHWERWIEGEND] Could not load 'plugins\SimpleArmor.jar' in folder 'plu
gins'
org.bukkit.plugin.InvalidPluginException: java.lang.NullPointerException
        at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.j
ava:149)
        at org.bukkit.plugin.SimplePluginManager.loadPlugin(SimplePluginManager.
java:305)
        at org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager
.java:230)
        at org.bukkit.craftbukkit.CraftServer.loadPlugins(CraftServer.java:213)
        at org.bukkit.craftbukkit.CraftServer.<init>(CraftServer.java:189)
        at net.minecraft.server.ServerConfigurationManager.<init>(ServerConfigur
ationManager.java:53)
        at net.minecraft.server.MinecraftServer.init(MinecraftServer.java:166)
        at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:432)
        at net.minecraft.server.ThreadServerApplication.run(SourceFile:492)
Caused by: java.lang.NullPointerException
        at me.Nils070697.SimpleArmor.SimpleArmor.<init>(SimpleArmor.java:14)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

        at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)

        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou
rce)
        at java.lang.reflect.Constructor.newInstance(Unknown Source)
        at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.j
ava:145)
        ... 8 more
 
X

|| xX [DEV][LP] Ms. DivaCraft Xx ||

Guest
Könnte vielleicht hierran liegen:
PluginManager manager = this.getServer().getPluginManager();

Weil das Plugin selber noch nicht geladen wurde? Ich bevorzuge Bukkit.getPluginManager();
 
M

MinecraftSpieler350

Guest
Mach das return erfolg weg und ersetze es durch return true oder return false

Und das getdescription nach command booelean ist auch falsch.

Das gehört wenn dann beim onenable teil dazu.

Ich entschuldige mich für die rechtschreibefehler grund dafür ist das ich am movilgerät sitze
 

Benni1000

Ehemaliges Teammitglied
Ehem. Teammitglied
Registriert
4 Mai 2012
Beiträge
1.396
Diamanten
0
Das mit dem erfolg=true oder false, hab ich jetzt schon das zweite mal gesehen.
Wer verbreitet bitte so einen Schwachsinn?
Nicht das es nicht funktionieren würde, aber es ist einfach unnötig, wenn man einfach return true; oder return false; machen kann.

Und das hier:
Code:
if(args.length == 0){
Ist nicht sehr benutzerfreundlich, warum sollte der command nicht funktionieren, wenn jemand was an das command anhängt?
 
C

ChristianG

Guest
@Benni
Das mit dem erfolg=false und so weiter hat der YouTuber DeBukkit verbreitet...
Er hat dies aber mal in einem späteren Video berichtigt, aber in den erstrn Video hat er es so erklärt...
 
X

|| xX [DEV][LP] Ms. DivaCraft Xx ||

Guest
Du solltest trotzdem auch eine Ausgabe für invalide Argumente machen etcpp.
Die methode mit Erfolg ist valide, jedoch wird dann die ganze Methode noch weiter ausgeführt. Ein
return true; oder ein return false; beendet automatisch die Funktion und es wird direkt weiterverarbeitet. (In deinem Fall kein Problem, aber trotzdem erwähnenswert)
 

Nils070697

Braumeister
Registriert
2 Juni 2012
Beiträge
347
Diamanten
0
Ich habe das mit den Variablen bei Bool Funktionen aus meinem Programmierstil in C++ übernommen, doch warum ich mir das mal angewöhnt hatte weiß ich nicht ;)
Doch natürlich habt ihr recht, nach dem Befehl kann ja kein weiterer kommen...
 

Nils070697

Braumeister
Registriert
2 Juni 2012
Beiträge
347
Diamanten
0
So ich warte jetzt nochmal mit einem neuen Problem auf und zwar funktioniert das Command Armor nicht wie ich es mir vorstelle.

Man soll /armor gefolgt von dem Rüstungstyp eingeben können um dann die entsprechenden Items bekommen zu kommen.
Deswegen war meine Idee, das 1. Argument mit den jeweiligen Strings zu vergleichen, doch bei mir springt der über alle if und else if drüber bis hinunter zum else und gibt den Error aus. (Die Stelle ist im Quellcode farbig markiert...)




SimpleArmor.jar
Code:
package me.Nils070697.SimpleArmor;

import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.plugin.java.JavaPlugin;

public class SimpleArmor extends JavaPlugin{
	

	@Override
	public void onDisable() {
		
		PluginDescriptionFile descFile = this.getDescription();
		System.out.println("[" + descFile.getName() + "]" + descFile.getName() + " wurde deaktiviert");
	
	}
	
	@Override
	public void onEnable() {
		loadConfig();
		
		PluginDescriptionFile descFile = this.getDescription();
		System.out.println("[" + descFile.getName() + "]" + descFile.getName() + " wurde aktiviert");
		System.out.println("[" + descFile.getName() + "] Version: " + descFile.getVersion());
		System.out.println("[" + descFile.getName() + "] Programmiert von " + descFile.getAuthors());
	
	}
	
	public boolean onCommand(CommandSender sender, Command cmd, String cmdLabel, String[] args){
		PluginDescriptionFile descFile = this.getDescription();
		
		Player p = (Player)sender;
		
		// Kommando "/armor"
		if(cmd.getName().equalsIgnoreCase("armor")){
			if(args.length == 0){
				

				
				String Error = this.getConfig().getString("Config.messages.Error");
				p.sendMessage(ChatColor.RED + "[" + descFile.getName() + "]" + ChatColor.AQUA + Error);
				
				return false;
				
			}
			
			[color=#ff0000]if(args.length == 1){
				
				Integer Helm;
				Integer Chest;
				Integer Leg;
				Integer Boot;
				Integer Sword;
				
				if(args[0] == "Leather"){
					
					Helm = 298;
					Chest = 299;
					Leg = 300;
					Boot = 301;
					Sword = 272;
										
				}
				else if(args[0] == "Chain"){
					
					Helm = 302;
					Chest = 303;
					Leg = 304;
					Boot = 305;
					Sword = 267;
										
				}
				else if(args[0] == "Iron"){
					
					Helm = 306;
					Chest = 307;
					Leg = 308;
					Boot = 309;
					Sword = 267;
										
				}
				else if(args[0] == "Gold"){
					
					Helm = 314;
					Chest = 315;
					Leg = 316;
					Boot = 317;
					Sword = 283;
										
				}
				else if(args[0] == "Diamond"){
					
					Helm = 310;
					Chest = 311;
					Leg = 312;
					Boot = 313;
					Sword = 276;
										
				}
				else{
					
					String Error = this.getConfig().getString("Config.messages.Error");
					p.sendMessage(ChatColor.RED + "[" + descFile.getName() + "]" + ChatColor.AQUA + Error);
					
					return false;
					
				}[/color]
				
				GiveArmor(p,Helm,Chest,Leg,Boot,Sword);
				
				String cArmor = this.getConfig().getString("Config.messages.Armor");
				p.sendMessage(ChatColor.RED + "[" + descFile.getName() + "]" + ChatColor.AQUA + cArmor);
				
				return true;
				
			}
		
			if(args.length <1){
				
				String Error = this.getConfig().getString("Config.messages.Error");
				p.sendMessage(ChatColor.RED + "[" + descFile.getName() + "]" + ChatColor.AQUA + Error);
				
				return false;
				
			}
			
		}
			
			// Kommando "/SimpleArmor"
			if(cmd.getName().equalsIgnoreCase("SimpleArmor")){
				if(args.length == 0){
					
					
					p.sendMessage(ChatColor.AQUA + "----------" + ChatColor.RED + "SimpleArmor Kommandoliste" + ChatColor.AQUA + "----------");
					String hArmor = this.getConfig().getString("Config.help.Armor");
					p.sendMessage(ChatColor.RED + "/armor" + ChatColor.AQUA + "  " + hArmor);
					String hSimpleArmor = this.getConfig().getString("Config.help.SimpleArmor");
					p.sendMessage(ChatColor.RED + "/Simplearmor" + ChatColor.AQUA + "  " + hSimpleArmor);
					
					return true;
					
				}
				else {
					
					return false;
				
				}
			
			}
		
		return false;
	}
	
	private void GiveArmor(Player play ,int ihelm ,int ichest,int ileg,int iboot,int iSword){
		
		// Diaruessi
		play.getInventory().setHelmet(new ItemStack(ihelm));
		play.getInventory().setChestplate(new ItemStack(ichest));
		play.getInventory().setLeggings(new ItemStack(ileg));
		play.getInventory().setBoots(new ItemStack(iboot));
		// Diaschwert
		play.getInventory().addItem(new ItemStack(iSword, 1));
	}
	
	private void loadConfig(){
		
		String path1 = "Config.messages.Armor";
		this.getConfig().addDefault(path1, "Du hast Rüstung und ein Schwert bekommen");
		String path2 = "Config.messages.Error";
		this.getConfig().addDefault(path2, "Es liegt ein Fehler in der Kommando Syntax vor.");
		
		String path10 = "Config.help.Armor";
		this.getConfig().addDefault(path10, "Gibt dir eine Diamantenrüstung und ein Diamantenschwert. (Leather, Chain, Iron, Gold, Diamond)");
		String path11 = "Config.help.SimpleArmor";
		this.getConfig().addDefault(path11, "Zeigt alle Befehle an.");
	
		this.getConfig().options().copyDefaults(true);
		this.saveConfig();
		
	}
	
	
}

EDIT: Farbig geht nicht in Codes...
 

Nils070697

Braumeister
Registriert
2 Juni 2012
Beiträge
347
Diamanten
0
So ich frage euch gerade einfach noch mal wenn das in Ordnung ist ;)

1. Ich will einen Countdown erstellen, dazu brauch ich 1 Sekündige Pausierungen. Darf ich das normal wie in jedem Java Programm machen? Oder nur mit einem bestimmten Befehl?
2. Kann ich innerhalb des Plugins pro Befehl mithilfe eines Integer-Wertes hochzählen, auf welche aber jeder Spieler zugreifen kann?

Danke im Vorraus!
 

Let's Mine

Ehemaliges Teammitglied
Ehem. Teammitglied
Registriert
1 Dezember 2011
Beiträge
421
Alter
14
Diamanten
300
Minecraft
LetsMine
Den main Bukkit Thread solltest du natürlich nicht pausieren.

Und mach einfach eine public Variable, die im Ram bleibt, z.B. in der Main Plugin class oder wie du das lösen willst.
 
X

|| xX [DEV][LP] Ms. DivaCraft Xx ||

Guest
Hier mal Beispiele:

zu 1)
Einfach z.B.
Code:
public MeinPlugin extends JavaPlugin{
private static int zahl = 0;

//....
Dann einfach zahl++;

zu 2) Das müsste in deine Plugin Main Klasse
Code:
this.getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable() {
   @Override
   public void run() {
       //deine Methode 
   }
}, (long) ZEIT*20);
Zur zeit sei gesagt es wird in Ticks angegeben. 20 Ticks~ 1 Sekunde

Mehr zum Sheduler findest du hier:
http://wiki.bukkit.org/Scheduler_Programming
 
Status
Für weitere Antworten geschlossen.
Oben