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

PlugIn Item, das im INV-Slot 22 einen Befehl ausführt

SLINIcraftet204

Redstoneengineer
Registriert
21 Juni 2018
Beiträge
32
Diamanten
306
Minecraft
SLINIcraftet204
Heyho... ich bräuchte etwas Hilfe bei einem Plugin was ich gerade schreibe...
es Geht um ein Plugin welches einen CommandBlock in das Inventar auf dem Slot 22 beim joinen legt und man dann auf diesen CommandBlock Q drückt und dann ein Befehl ausgeführtwerden soll... Jetzt benötige ich etwas Hilfe beim Erkennen, dass die Q taste auf dem Item gedrückt wird unddann halt der Befehl ausgeführt wird. Ich schicke mal meinen Code rein den ich bereits habe: (Bitte nicht haten wegen dem Code)


Java:
package de.slini.cn;

import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryDragEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerPickupItemEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;


public class PlayerJoin implements Listener {


    @EventHandler
    public void onClick(InventoryClickEvent e) {
        e.setCancelled(true);
    }

    @EventHandler
    public void onDrop(PlayerDropItemEvent e) {
        e.setCancelled(true);
    }

    @EventHandler
    public void onDrag(InventoryDragEvent e) {
        e.setCancelled(true);
    }

    @EventHandler
    public void onBuild(PlayerPickupItemEvent e) {
        e.setCancelled(true);
    }

    @EventHandler
    public void onjoinPlayer(PlayerJoinEvent e) {
        Player p = e.getPlayer();

        if (p.hasPermission("cn.inv")) {
            p.sendMessage("§6Du hast jetzt die Macht über das CloudNet");
            ItemStack item = new ItemStack(Material.COMMAND);
            ItemMeta itemMeta = item.getItemMeta();
            itemMeta.setDisplayName("§eMAGIC ITEM");
            item.setItemMeta(itemMeta);
            p.getInventory().setItem(22, item);
        } else {
            ItemStack item = new ItemStack(Material.BARRIER);
            ItemMeta itemMeta = item.getItemMeta();
            itemMeta.setDisplayName("§eLOCKED ADMIN ITEM");
            item.setItemMeta(itemMeta);
            p.getInventory().setItem(22, item);
        }

    }
}
Ich danke für jede Hilfe
 

Malfrador

Threadripper
Registriert
16 Juni 2013
Beiträge
1.473
Diamanten
396
Minecraft
Malfrador
Slot 22 ist ein slot im Inventar selbst und nicht in der Hotbar, daher wird das InventoryClickEvent benötigt.
Das PlayerDropItemEvent wird zwar auch eventuell ausgelöst, aber erst danach so das es nicht möglich ist festzustellen aus welchem Slot das Item stammt.

Du kannst beim InventoryClickEvent dann mit getClick() herausfinden, ob es sich um den ClickType "DROP" oder "CONTROL_DROP" handelt und mit getSlot() um welchen Slot es geht. Damit solltest du in der Lage sein das zu erreichen was du möchtest.

Beachte aber das du das ganze wahrscheinlich im Survival-Modus benutzen musst. Das Creative-Inventory verhält sich anders (und seltsam) bei den meisten Dingen. Solltest du diese Funktionalität auch im Creative brauchen bietet das InventoryCreativeEvent die gleichen Methoden.
 

SLINIcraftet204

Redstoneengineer
Registriert
21 Juni 2018
Beiträge
32
Diamanten
306
Minecraft
SLINIcraftet204
Slot 22 ist ein slot im Inventar selbst und nicht in der Hotbar, daher wird das InventoryClickEvent benötigt.
Das PlayerDropItemEvent wird zwar auch eventuell ausgelöst, aber erst danach so das es nicht möglich ist festzustellen aus welchem Slot das Item stammt.

Du kannst beim InventoryClickEvent dann mit getClick() herausfinden, ob es sich um den ClickType "DROP" oder "CONTROL_DROP" handelt und mit getSlot() um welchen Slot es geht. Damit solltest du in der Lage sein das zu erreichen was du möchtest.

Beachte aber das du das ganze wahrscheinlich im Survival-Modus benutzen musst. Das Creative-Inventory verhält sich anders (und seltsam) bei den meisten Dingen. Solltest du diese Funktionalität auch im Creative brauchen bietet das InventoryCreativeEvent die gleichen Methoden.
Cool danke für die anlaufstelle :) eine frage noch weißt du zufällig wie ich dann durch dieses Event dann den Befehl (zbs:say Hallo) ausführen kann? aber auf jeden Fall vielen danke für die Hilfe
 

SLINIcraftet204

Redstoneengineer
Registriert
21 Juni 2018
Beiträge
32
Diamanten
306
Minecraft
SLINIcraftet204
Die entsprechende Methode stammt vom Server (Bukkit.getServer() ) und heißt dispatchCommand(). Die Methode erwartet eine Sender und einen Befehl (ohne /). Der Sender kann entweder ein Spieler oder die Konsole sein (Bukkit.getConsoleSender() ).
Ok danke werde es mal testen bei Fragen melde ich mich
 

SLINIcraftet204

Redstoneengineer
Registriert
21 Juni 2018
Beiträge
32
Diamanten
306
Minecraft
SLINIcraftet204
Hi bei mir sieht die Methode jetzt so aus, ich habe diesen Abschnitt hinzugefügt... aber es geht nicht bitte um weitere Hilfe
Java:
public static void OnInteract(InventoryClickEvent e) {

        if (e.getClick() == ClickType.SHIFT_RIGHT) {
            Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), "controlpanel");
        }
    }
ist es auch möglich den Befehl als SPieler und nicht als Console ausführen zu lassen?
 

Avankziar

Schafhirte
Registriert
12 Februar 2018
Beiträge
135
Alter
33
Diamanten
324
Minecraft
Avankziar
Ich hoffe mal, das du den Listener implementiert hast, sowie auch den EventHandler. Auch hoffe ich die Klasse ist in der Main Klasse als Event regestriert worden. Sowi macht man eigentlich Methoden von Events nicht static....

Wenn das alles zutrifft, dann müsstest du nun in jedem Inventar, in allen Slots mit Shift Rechtsklick den befehl ausführen können. Natürlich vorrausgesetzt der Befehl "controlpanel" existiert genau so und die Console darf den ausführen. (Weil nicht jeder Befehl sind für Consolen geschrieben worden.)

Wenn du den Slot noch mit abfragen willst, dann mach so:
Code:
@EventHandler
public void onInteract(InventoryClickEvent event)
{
    if(event.getInventory().getType() != InventoryType.PLAYER)
    {
        return;
    }
    if(event.getSlotType() != SlotType.CONTAINER) //Wobei, dies müsste man testen, da bin ich nicht ganz sicher^^
    {
        return;
    }
    if(event.getSlot() != 22)
    {
        return;
    }
    if (event.getClick() != ClickType.SHIFT_RIGHT)
    {
           return;
    }
    Bukkit.getServer().dispatchCommand(event.getPlayer(), "controlpanel");
    //Mache hier weiter.
}
 
Oben