ServerPlugin Schild an Kiste bei Blockbreak automatisch löschen

Dieses Thema im Forum "Programmierung" wurde erstellt von Proxx, 27. Juli 2014.

  1. Proxx
    Offline

    Proxx

    Registriert seit:
    4. Mai 2014
    Beiträge:
    11
    Hi zusammen,

    ich schreibe gerade an einem Plugin, bei dem man unter anderem Kisten per Command beschriften lassen kann. Per

    /boxsign Holz

    und einem Klick auf eine Kiste soll an dessen Vorderseite ein Schild mit dem entsprechenden Text (z.B. "Holz") angebracht werden. Klappt auch schon soweit.
    Beim Abbau der Kiste werden Schilder ja dann normalerweise auch einfach abgebaut und der Spieler kann sie in sein Inventar holen. Das will ich aber in meinem Fall vermeiden, damit man sich nicht unendlich viele Schilder generieren lassen kann.
    Ist es irgendwie möglich, dass ich das Schild beim Abbau der Kiste lösche, bevor der Spieler es aufsammelt?

    Mein bisheriger Ansatz sieht so aus:
    Code (Text):
    1.  
    2. @EventHandler
    3. public void onBlockBreak(BlockBreakEvent event) {
    4.     Block block = event.getBlock();
    5.        
    6.     // check if a chest was broken, return otherwise
    7.     Material blockType = block.getType();
    8.     if(blockType != Material.CHEST) {
    9.         return;
    10.     }
    11.        
    12.     // check if the chest is a box in the database, return otherwise
    13.     if(!isChestRegistered(block)) {
    14.         return;
    15.     }
    16.    
    17.     // delete the chest in the database
    18.     unregisterChest(block);
    19.    
    20.     // TODO: delete all adjacent signs and their drops
    21. }
    22.  
    Der Code bei // TODO ist das, was mir fehlt.

    Grüße
    Proxx
     
    #1
  2. Du kannst ja bereits ein Schild platzieren und beschriften.

    Löschen eines Schildes ist einfach.

    Definiertes Schild s;
    s.getBlock().setMaterial(Material.AIR);

    Dies kannst du machen, sobald eine Kiste zerstört wird. (Ein Cache System wäre vielleicht sinnvoll: Metadata)
    Beim Zerstören des Schildes kannst du ensprechend die Drops verändern.

    Definiertes BlockBreakEvent e:
    e.setCancelled(true);
    e.getBlock().setType(Material.AIR);
     
    #2
  3. Proxx
    Offline

    Proxx

    Registriert seit:
    4. Mai 2014
    Beiträge:
    11
    Danke für die Hilfestellung.
    Wird das BlockBreak-Event eigentlich öfter gefeuert, wenn eine Kiste mit einem Schild an seiner Vorderseite zerstört wird? Also ein mal für die Kiste und ein mal für das Schild? Dann könnte ich ja eine Fallunterscheidung im BlockBreak-Eventhandler schreiben.
    Als "Cache-System" nutze ich eine MySql-Datenbank. Darin verwalte ich noch ein paar andere Daten anderer Funktionen meines Plugins.
     
    #3
  4. Also dürfte das Event nicht ausgelöst werden, denn es handelt sich hier bei der Zerstörung des Schildes um Physik.

    Jedoch würde ich eher auf das eingebaute Metadata-Caching-System vertrauen und MySQL als Speichersystem. Das MetaData System kann nämlich direkt für einen Key bei einem Metadatable ein Objekte/Daten speichern.

    Durch das BlockFace + block.getRelative kannst du alle angrenzenden Blöcke erfragen, die du entsprechend abfragen willst.
     
    #4