Bukkit Plugin, Virtuelles Inventar

01/25/2014 20:13 themrdomi#1
Hallo, ich bin gerade dabei ein kleines Plugin zu schreiben, dass bei einem Rechtsklick auf einen Block ein Inventar öffnet.
Ich habe das Ganze in 2 Klassen aufgeteilt, übersichtshalber.
In der ersten Klasse habe ich jedoch ein Problem, und zwar beim anzeigen des Menüs.
Sieht jemand von euch den Fehler?
Wäre echt klasse.
Code:
package me.themrdomi.Spawn;

import java.awt.Menu;

import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.plugin.java.JavaPlugin;

public class main extends JavaPlugin implements Listener {

	private Menu menu;
	
	public void onEnable() {
		menu = new Menu();
		Bukkit.getServer().getPluginManager().registerEvents(this, this);
	}
	
	@EventHandler
	public void onPlayerInteract(PlayerInteractEvent e) {
		if (!(e.getAction() == Action.RIGHT_CLICK_BLOCK)) 
		menu.show(e.getPlayer());
	}
}
Der Fehler wird mir bei show ganz unten angezeigt, es ist Rot unterstrichen und zeigt mir folgenden Fehler an:

Add cast to 'menu'

Wenn ich den Fehler allerdings mithilfe von Eclipse korrigiere zeigt er mir immernoch einen Fehler an.
01/25/2014 20:20 Howaner#2
Kannst du uns die Menu Klasse zeigen?
01/25/2014 20:27 Freak2011#3
Falscher Import?: "import java.awt.Menu;"
01/25/2014 20:37 themrdomi#4
Ja, hier ist sie:
Code:
package me.themrdomi.Spawn;

import java.util.Arrays;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.DyeColor;
import org.bukkit.GameMode;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.material.Wool;
import org.bukkit.plugin.Plugin;

public class menu implements Listener {

	private Inventory inv;
	private ItemStack c, s, a;
	
	public menu(Plugin p) {
		inv = Bukkit.getServer().createInventory(null, 9, "Gamemode Chooser");
		
		c = createItem(DyeColor.GREEN, ChatColor.GREEN + "Creative");
		s = createItem(DyeColor.YELLOW, ChatColor.YELLOW + "Survival");
		a = createItem(DyeColor.RED, ChatColor.RED + "Adventure");
		
		inv.setItem(2, c);
		inv.setItem(4, s);
		inv.setItem(6, a);
		
		Bukkit.getServer().getPluginManager().registerEvents(this, p);
	}
	
	private ItemStack createItem(DyeColor dc, String name) {
		ItemStack i = new Wool(dc).toItemStack(1);
		ItemMeta im = i.getItemMeta();
		im.setDisplayName(name);
		im.setLore(Arrays.asList("Set your gamemode", "to " + name.toLowerCase() + " mode"));
		i.setItemMeta(im);
		return i;
	}
	
	public void show(Player p) {
		p.openInventory(inv);
	}
	
	@EventHandler
	public void onInventoryClick(InventoryClickEvent e) {
		if (!e.getInventory().getName().equalsIgnoreCase(inv.getName())) return;
		if (e.getCurrentItem().getItemMeta() == null) return;
		if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Creative")) {
			e.setCancelled(true);
			e.getWhoClicked().setGameMode(GameMode.CREATIVE);
			e.getWhoClicked().closeInventory();
		}
		if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Survival")) {
			e.setCancelled(true);
			e.getWhoClicked().setGameMode(GameMode.SURVIVAL);
			e.getWhoClicked().closeInventory();
		}
		if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Adventure")) {
			e.setCancelled(true);
			e.getWhoClicked().setGameMode(GameMode.ADVENTURE);
			e.getWhoClicked().closeInventory();
		}
	}
}
01/25/2014 20:41 lordsill#5
dann würde ich den
Code:
import java.awt.Menu;
mal entfernen in der 1. Datei

und die Zeile:

Code:
private Menu menu;
zu

Code:
private menu menu;
für eine bessere Übersicht solltest du evtl den namen der variable ändern in z.b.
Code:
private menu invmenu;
ändern

Den ganzen kompletten eher richtigen code:

Code:
package me.themrdomi.Spawn;

import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.plugin.java.JavaPlugin;

public class main extends JavaPlugin implements Listener {

	private menu invmenu;
	
	public void onEnable() {
		Bukkit.getServer().getPluginManager().registerEvents(this, this);
	}
	
	@EventHandler
	public void onPlayerInteract(PlayerInteractEvent e) {
		if (e.getAction() == Action.RIGHT_CLICK_BLOCK)
                {
                     invmenu = new menu(this);
		     invmenu.show(e.getPlayer());
                }
	}
}
01/25/2014 20:44 themrdomi#6
Danke, das wars :)

Eine kleine Frage hätte ich allerdings noch:
Ich hatte es bis jetzt so, dass das virtuelle Inventar sich öffnet, wenn man einen Rechtsklick auf einen Block macht, nun würde ich es allerdings gerne haben, dass man mit einem bestimmten Item in der Hand einen Rechtsklick auf einen Block machen muss.
Wie geht das?

Code:
	@EventHandler
	public void onPlayerInteract(PlayerInteractEvent e) {
		if (!(e.getAction() == Action.RIGHT_CLICK_BLOCK)) return;
		menu.show(e.getPlayer());
	}
Das müsste irgendwie mit ItemInHand gehen, oder?

Lg
04/13/2014 18:15 Tosel#7
So:
Code:
@EventHandler
public void onPlayerInteract(PlayerInteractEvent e) {
	if (e.getAction() == Action.RIGHT_CLICK_BLOCK) {
	       if(event.getPlayer().getItemInHand().getType() == Material.APPLE) {
			menu.show(e.getPlayer());
		}
	}
}
Das sollte gehen :)

mfg. Tobi