Minecraft Plugin programmieren Item verschieben oder droppen verbieten?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Okay, also Du hast bereits einen Befehl, mit dem Du das Inventar erstellst, mit Items befüllst und öffnest.

Jetzt brauchst Du den Code, der das Verschieben der Items verhindert, sowie das droppen, richtig?

Dann fangen wir mal mit dem InventoryClickEvent an:

@EventHandler
public void onClick(InventoryClickEvent e) {
  if (e.getInventory().getName().equals("§6§lRank-Up")) {
    if (e.getCurrentItem() != null && e.getCurrentItem().getType() != Material.AIR) {
      e.setCancelled(true);    
    }
  }
}

Und fürs Droppen brauchst Du das PlayerDropItemEvent:

@EventHandler
public void onDrop(PlayerDropItemEvent e) {
  if (e.getPlayer().getOpenInventory​().getTitle().equals("§6§lRank-Up")) {
    e.setCancelled(true);
  }
}

Natürlich müssen beide Listener in der jeweiligen Klasse implementiert und in der Hauptklasse registriert werden.

Was mir gerade beim Durchlesen Deines Codes noch aufgefallen ist, ist dass Du das Inventar direkt öffnest, nachdem du es erstellst, und danach erst die Items befüllst etc.
Ich würde An Deiner Stelle "p.openInventory(inventory);" lieber ans Ende setzen.

Ich gebe kein Gewähr auf Richtigkeit. Ich habe das gerade nur schnell runtergeschrieben, ohne es zu testen.
Falls noch Probleme aufkommen sollten, bin ich gerne bereit, weitergehend zu helfen.

Woher ich das weiß:Hobby – Langjährige Programmiererfahrung
Diegi07 
Fragesteller
 02.08.2019, 12:30

Stimmt dieser Code jetzt, weil das mit dem verschieben geht immernoch:

package de.diego.rankup.commands;


import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;


public class RankUpCommand implements CommandExecutor {


	@Override
	public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
		Player p = (Player) sender;
		if(p.hasPermission("rankup.open")) {
			if((sender instanceof Player)) {
				if(args.length == 0) {
					Inventory inventory = Bukkit.createInventory(null, 9*3, "§6§lRank-Up");
					p.sendMessage("§7Du hast das Rank-Up Menü geöffnet!");
					
					ItemStack diamond = new ItemStack(Material.DIAMOND);
					ItemMeta itemMeta = diamond.getItemMeta();
					itemMeta.setDisplayName("§b§lDiamond Rang");
					diamond.setItemMeta(itemMeta);


					inventory.setItem(11, diamond);
					
					ItemStack ultra = new ItemStack(Material.BEACON);
					ItemMeta ItemMeta = ultra.getItemMeta();
					ItemMeta.setDisplayName("§b§lUltra Rang");
					ultra.setItemMeta(ItemMeta);
					
					inventory.setItem(13, ultra);
					
					ItemStack supreme = new ItemStack(Material.REDSTONE_BLOCK);
					ItemMeta iTemMeta = supreme.getItemMeta();
					iTemMeta.setDisplayName("§4§lSupreme Rang");
					supreme.setItemMeta(iTemMeta);
					
					inventory.setItem(15, supreme);
					
					ItemStack glass = new ItemStack(Material.STAINED_GLASS_PANE);
					ItemMeta itemmeta = glass.getItemMeta();
					itemmeta.setDisplayName("");
					supreme.setItemMeta(itemmeta);
					
					inventory.setItem(0, glass);
					inventory.setItem(1, glass);
					inventory.setItem(2, glass);
					inventory.setItem(3, glass);
					inventory.setItem(4, glass);
					inventory.setItem(5, glass);
					inventory.setItem(6, glass);
					inventory.setItem(7, glass);
					inventory.setItem(8, glass);
					inventory.setItem(9, glass);
					inventory.setItem(10, glass);
					inventory.setItem(12, glass);
					inventory.setItem(14, glass);
					inventory.setItem(16, glass);
					inventory.setItem(17, glass);
					inventory.setItem(18, glass);
					inventory.setItem(19, glass);
					inventory.setItem(20, glass);
					inventory.setItem(21, glass);
					inventory.setItem(22, glass);
					inventory.setItem(23, glass);
					inventory.setItem(24, glass);
					inventory.setItem(25, glass);
					inventory.setItem(26, glass);
					inventory.setItem(27, glass);
					inventory.setItem(28, glass);
					p.openInventory(inventory);  {
				
				}
				
			}
					}
				}
			
		
		return false;
	}


@EventHandler
public void onClick(InventoryClickEvent e) {
  if (e.getInventory().getName().equals("§6§lRank-Up")) {
    if (e.getCurrentItem() != null && e.getCurrentItem().getType() != Material.AIR) {
      e.setCancelled(true);    
    }
  }
} 


@EventHandler
public void onDrop(PlayerDropItemEvent e) {
  if (e.getPlayer().getOpenInventory().getTitle().equals("§6§lRank-Up")) {
    e.setCancelled(true);
  }
} 
}


0
TheHunter147  02.08.2019, 13:04
@Diegi07

du musst den listener ja auch implementieren.

public class RankUpCommand implements CommandExecutor, Listener {

und in der Main Klasse (im onEnable()) den Listener registrieren:

getServer().getPluginManager().registerEvents(new RankUpCommand(), this);
1
Diegi07 
Fragesteller
 02.08.2019, 13:21
@TheHunter147

Aber ich kann es nicht in der Main Klasse registrieren. Da kommt dann immer die Meldung: The method registerEvents(Listener, Plugin) in the type PluginManager is not applicable for the arguments (RankUpCommand, Main)

0
TheHunter147  02.08.2019, 13:55
@Diegi07

schick mal den ganzen Code der Main Klasse. Ich vermute, Du hast den falschen Listener importiert. Das hier wäre richtig:

import org.bukkit.event.Listener;
0
Tallerik  03.08.2019, 10:48
@Diegi07

Um Events ausführen zu können muss die Klasse

Listener

implementieren.

Zusätzlich benötigst du

getServer().getPluginManager().registerEvents(new RankUpCommand(), this);

in deiner onEnable() methode in der Plugin Mainklasse.

0

Hallo,

du kannst in einem Event (InventoryMoveItemEvent müsste es sein) mit

@EventHandler(priority = EventPriority.NORMAL)
public void onInventoryMoveItemEvent(final InventoryMoveItemEvent event) {
event.setCancelled(true);
} 

Du kannst auch noch checken, ob das Inventar so heißt wie du es benannt hast, aktuell verbietet er das bei jedem Inventar.

Viele Grüße

Woher ich das weiß:Berufserfahrung
Seliba  02.08.2019, 12:13

Dieses Event wird auch von z.B. Hoppern, die Sachen in andere Inventare schieben, ausgelöst.

0