Jump to content

Trankeffekte über Config


KleinMuffin
 Share

Recommended Posts

Heyho ich wollte mal fragen, ob sich irgendwer mit Configs in Bukkit auskennt. Und zwar möchte ich es bei meinem Plugin so machen, dass man einen in der Config konfigurierbaren Trankeffekt bekommt sobald man einen Kuchen anklickt.

Ich freue mich über jede Antwort die mir etwas weiterhilft :)

Link to comment
Share on other sites

Okay, ich schreib dir da gleich mal was zu und erklär's. Schaue parallel einen doch recht lustigen Stream, von daher ist meine Hirnleistung nicht bei 100%, könnte also etwas dauern.

Liebe Grüße,

Baustein

Link to comment
Share on other sites

So, sorry für die Wartezeit, das war noch länger, als ich vermutet hatte.

Ich zeige dir erstmal den gesamten Code und den gehen wir dann Schritt für Schritt durch.

Hier der Code auf Pastebin (lange Codezeilen sehen hier relativ bescheiden aus)-

Fangen wir oben an.

PotionEffect pE;public void onEnable() {	this.getConfig().addDefault("PotionEffect", PotionEffectType.BLINDNESS.getName());	this.getConfig().addDefault("Duration", 10);	this.getConfig().addDefault("Amplifier", 1);	this.getConfig().options().copyDefaults(true);	this.saveConfig();		try {		pE = new PotionEffect(PotionEffectType.getByName(this.getConfig().getString("PotionEffect")), this.getConfig().getInt("Duration"), this.getConfig().getInt("Amplifier"));	} catch (Exception e) {		this.getServer().getConsoleSender().sendMessage(ChatColor.RED + "Fehler in der Konfiguration von KleinMuffin!");		pE = null;	}			this.getServer().getPluginManager().registerEvents(this, this);}
Zuerst erstelle ich eine leere Variable des Typs PotionEffect. Das wird der PotionEffect sein, den ich später dem Spieler vergebe, wenn er auf einen Kuchen klickt.

Danach kommt die onEnable()-Methode. Ich schätze mal, dass du von der schon weißt, dass sie bei jedem Laden des Plugins (Start / Neustart / Reload) ausgeführt wird.

Innerhalb der onEnable() lege ich einige Defaults in der Config fest. Das sind einfach Standard-Werte, die dann in die Config-Datei geschrieben werden, wenn sie leer ist.

Die Standard-Config sähe mit diesen drei Zeilen also so aus:

PotionEffect: BLINDNESSDuration: 10Amplifier: 1
Größere Pfade kannst du in der Config beispielsweise mit "Settings.PotionEffect" machen. Dann sähe die Config beispielsweise so aus:

Settings:    PotionEffect: BLINDNESSDuration: 10Amplifier: 1
In der 24. Zeile schalte ich an, dass die Standard-Werte tatsächlich auch eingefügt werden und in der darauffolgenden Zeile speichere ich die Config.

Nun folgt ein try-catch-Vorgang. In Diesem erstelle ich den PotionEffect, dem ich oben noch keinen Wert zugewiesen habe. Als Parameter nehme ich mit getString(String path) und getInt(String path) die in der Config festgelegten Werte.

Sollte dabei eine Exception auftreten liegt das daran, dass etwas in der Config falsch gemacht wurde. Der User könnte beispielsweise bei Duration einen String oder bei PotionEffect eine falsche Angabe gebracht haben. Anstatt da einfach einen Log in der Konsole ausgeben zu lassen fange ich die Exception lieber ab, gebe eine benutzerdefinierte Nachricht aus und setze pE wieder den ursprünglichen, "leeren" Wert.

Am Ende der onEnable() registriere ich noch einen EventListener in derselben Klasse, das sollte dir auch schon geläufig sein, ansonsten sag einfach bescheid ;)

@EventHandlerpublic void onEatCake(PlayerInteractEvent pie) {	if (pie.getAction() == Action.RIGHT_CLICK_BLOCK) {		System.out.println("Right_Click_Block");		if (pie.getClickedBlock() != null && pie.getClickedBlock().getType() == Material.CAKE_BLOCK) {			System.out.println("Kuchen");			Player p = pie.getPlayer();						if (pE == null) {				p.sendMessage(ChatColor.RED + "Wegen einem Fehler in der Konfiguration von KleinMuffin kann dir momentan leider kein PotionEffect zugewiesen werden.");				return;			}						p.addPotionEffect(pE);						}	}}
Hier geht es darum, zu erkennen, wenn der Spieler auf einen Kuchen rechtsklickt. Dafür nutze ich das PlayerInteractEvent, da ich glaube, dass das PlayerItemConsumeEvent nicht mit Kuchen funktioniert. In Zeile 41 frage ich dann ab, ob auf einen Block gerechtsklickt wurde.

In Zeile 42 ist mir noch eine Debug-Nachricht untergelaufen, die brauchst du nicht weiter zu beachten, genauso wie in Zeile 44. In deinem eigenen Code kannst du diese einfach weglassen, die hatte ich nur zum Testen ;)

In der darauffolgenden if-Abfrage mache ich einen Null-Check, sodass ich bei einem "leeren" Block keine NPE bekomme (obwohl das bei Action.RIGHT_CLICK_BLOCK eigentlich nie passieren dürfte, aber Vorsicht ist nie schlecht) und gleichzeitig schaue ich das Material des Blocks nach. Es gibt Material.CAKE und Material.CAKE_BLOCK, ich weiß nicht genau, wo der Unterschied ist, aber mit CAKE_BLOCK funktioniert's, und mit CAKE nicht.

Falls in der onEnable ein Fehler in der Konfiguration entdeckt wurde erkenne ich das in Zeile 47 und gebe dem Spieler eine entsprechende Nachricht aus. Mit return komme ich aus der Methode raus, denn falls pE null war soll bei diesem Punkt ja Schluss sein.

Wegen diesem return brauche ich auch kein else, und kann direkt den PotionEffect zuweisen.

public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {	if (cmd.getName().equalsIgnoreCase("kleinmuffin")) {		if (!sender.hasPermission("kleinmuffin")) {			sender.sendMessage(ChatColor.RED + "Du hast keine Erlaubnis, dieses Kommando auszuführen.");			return true;		}		sender.sendMessage(ChatColor.YELLOW + "<---------------------------->");		sender.sendMessage(ChatColor.GRAY + PotionEffectType.ABSORPTION.getName());		sender.sendMessage(ChatColor.GRAY + PotionEffectType.BLINDNESS.getName());		sender.sendMessage(ChatColor.GRAY + PotionEffectType.CONFUSION.getName());		sender.sendMessage(ChatColor.GRAY + PotionEffectType.DAMAGE_RESISTANCE.getName());		sender.sendMessage(ChatColor.GRAY + PotionEffectType.FAST_DIGGING.getName());		sender.sendMessage(ChatColor.GRAY + PotionEffectType.FIRE_RESISTANCE.getName());		sender.sendMessage(ChatColor.GRAY + PotionEffectType.HARM.getName());		sender.sendMessage(ChatColor.GRAY + PotionEffectType.HEAL.getName());		sender.sendMessage(ChatColor.GRAY + PotionEffectType.HEALTH_BOOST.getName());		sender.sendMessage(ChatColor.GRAY + PotionEffectType.HUNGER.getName());		sender.sendMessage(ChatColor.GRAY + PotionEffectType.INCREASE_DAMAGE.getName());		sender.sendMessage(ChatColor.GRAY + PotionEffectType.INVISIBILITY.getName());		sender.sendMessage(ChatColor.GRAY + PotionEffectType.JUMP.getName());		sender.sendMessage(ChatColor.GRAY + PotionEffectType.NIGHT_VISION.getName());		sender.sendMessage(ChatColor.GRAY + PotionEffectType.POISON.getName());		sender.sendMessage(ChatColor.GRAY + PotionEffectType.REGENERATION.getName());		sender.sendMessage(ChatColor.GRAY + PotionEffectType.SATURATION.getName());		sender.sendMessage(ChatColor.GRAY + PotionEffectType.SLOW.getName());		sender.sendMessage(ChatColor.GRAY + PotionEffectType.SLOW_DIGGING.getName());		sender.sendMessage(ChatColor.GRAY + PotionEffectType.SPEED.getName());		sender.sendMessage(ChatColor.GRAY + PotionEffectType.WATER_BREATHING.getName());		sender.sendMessage(ChatColor.GRAY + PotionEffectType.WEAKNESS.getName());		sender.sendMessage(ChatColor.GRAY + PotionEffectType.WITHER.getName());					sender.sendMessage(ChatColor.YELLOW + "<---------------------------->");		return true;	}

Hallo, Arcalio, ich weiß doch, dass deine Alarmglocken bei solchem Code anfangen, zu bimmeln.

Unten im Spoiler rechtfertige ich die unschöne Schreibweise für die, die es interessiert.

Der Sinn dieses Kommandos ist der, dass der Endverbraucher des Plugins höchstwahrscheinlich nicht weiß, was Bukkit für Namen für die PotionEffects hat, diese jedoch mit dem Kommando /kleinmuffin einsehen kann. Denn in der Config muss der Bukkit-PotionEffect-Name angegeben werden.

Ja, das war der ganze Code. Solltest du noch Fragen haben, nur raus mit der Sprache ;)

Auch möchte ich dich auf meine How-To-Reihe verweisen, wo ich auch auf Configs eingegangen bin. Den entsprechenden Post findest du hier. Einfach Strg + F drücken, nach "Config" suchen und ins Ballungsgebiet scrollen :D Ich entschuldige mich hier schonmal dafür, dass die Bilder nicht mehr existieren und demnach nicht angezeigt werden.

Sollte ich dir geholfen haben würde ich mich wirklich sehr darüber freuen, wenn du auf "Gefällt mir" am unteren rechten Beitragsrand klickst. Danke :)

Liebe Grüße,

Baustein

Warum mache ich so blöden Code?

Weil's anders scheinbar nicht geht. PotionEffectType ist kein Enum, sondern eine Klasse. Trotzdem gibt es die Methode values(), die ja doch sehr interessant für eine for-Schleife wäre.

Und eben diese for-Schleife wirft eine NPE.

Das kann man ja auch selber ausprobieren ;)

pET bleibt null, und wird nicht zugewiesen. Da mir sonst auf die Schnelle keine andere Möglichkeit in den Sinn kam, habe ich daher per Hand alle PotionEffects ausgegeben.

Danke an dieser Stelle an TuxGamer, der mir in dieser schweren Zeit beistand und auch keine Lösung fand. ^^

public static PotionEffectType[] values() {    return byId.clone();} 
for (PotionEffectType pET : PotionEffectType.values()) System.out.println(pET.getName());

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...
B
B