ServerPlugin Einige Fragen!

Dieses Thema im Forum "Programmierung" wurde erstellt von Masterfran99, 9. März 2014.

  1. Masterfran99
    Offline

    Masterfran99 Gesperrt

    Registriert seit:
    13. Oktober 2012
    Beiträge:
    100
    Hallo,

    Ich habe da mal paar Fragen:

    1. Wie kann ich aus der Klasse "run.class" den Scheduler in dieser Klasse stoppen "stop.class"??

    2. Es wäre cool zu wissen wie man folgendes macht: Man benutzt einen Befehl es überprüft ob man einen Spieler anschaut oder nicht dann passiert etwas.

    3. Welches Event damit jeder Spieler einen bestimmten Block nicht bauen kann.

    4. Ist es möglich zu verhindern das ein Spieler im Kreativ Modus z.b. Bedrock aus dem Inventar nehmen kann?

    5. Wie kann ich mit einen Befehl wo Argument 1 also /reiten <Name> den Spieler definieren?

    Danke für jede hilfe!
    Ich hab das Java Handbuch schon gelesenen aber ich teste lieber.
     
    #1
  2. WaveMC
    Offline

    WaveMC

    Registriert seit:
    8. März 2014
    Beiträge:
    2
    Minecraft:
    lumagr99
    Zu 3.

    Du kannst dafür das Block Break Event verwenden, du musst nur abfragen welcher Block es ist und wenns der Block ist der nicht abgebaut werden soll das Event cancceln.

    Beispiel:
    Code (Text):
    1.     @EventHandler
    2.     public void onBreak(BlockBreakEvent e){
    3.         if(e.getBlock() == new ItemStack(Material.ANVIL)){
    4.            
    5.             e.setCancelled(true);
    6.             e.getPlayer().sendMessage(this.plugin.prefix+"Don't destroy the map!");
    7.         }
    8.     }
    Noch Fragen? Skype: lumagr2
     
    #2
  3. Benutzer
    Offline

    Benutzer

    Registriert seit:
    1. November 2012
    Beiträge:
    56
    zum 5ten Punkt:

    Code (Text):
    1.  
    2. if(cmd.getName().equalsIgnoreCase("XY")) {
    3.    if(args.length >= 1) {
    4.       if(Bukkit.getServer().getPlayer(args[0]) != null) {
    5.           Player targetPlayer = Bukkit.getServer().getPlayer(args[0]);
    6.       }
    7.    }
    8. }
    9.  

    MFG Benutzer
     
    #3
  4. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Zum 1.: Die Methode, die den Scheduler startet, gibt die ID des Schedulers zurück. Diese musst du dann nur süeichern.

    Code (Text):
    1. final int id = getServer().getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() {
    2.   public void run() {
    3.     //Some code
    4.     getServer().getScheduler().cancelTask(id);
    5.   }, 20, 20);
    -
    Zum 2.: Ja, mit dem InventoryClickEvent:
    Code (Text):
    1. @EventHandler
    2. public void onInventoryClick(InventoryClickEvent e) {
    3.   Player p = (Player) e.getWhoClicked();
    4.   if (e.getCurrentItem().getType() == Material.BEDROCK && p.getGameMode() == GameMode.CREATIVE) {
    5.    e.setCancelled(true);
    6.    p.sendMessage("Du darfst im Creativemode kein Bedrock benutzen!");
    7.   }
    8. }
     
    #4
  5. Masterfran99
    Offline

    Masterfran99 Gesperrt

    Registriert seit:
    13. Oktober 2012
    Beiträge:
    100
    Vielen Dank,

    Nur noch Frage 2 weiß ich nicht z.b. WorldEdit macht ja den /tree Befehl :D
    Und der wird dort gespawnt welchen Block man anschaut damit meine ich den Block worauf das Zielkreuz zielt.
     
    #5
  6. delta242
    Offline

    delta242

    Registriert seit:
    28. Mai 2012
    Beiträge:
    90
    zu 5:
    Kann man unterschiedlich machen. Du kannst bei jedem Inventar Anklicken überprüfen ob der Spieler Bedrock im Inventar hat und es dann ggf. entfernen. Du kannst auch in einem Scheduler einmal pro Tick/Sekunde das gleiche Überprüfen.
    Am sinnvollsten wäre wenn du mit dem InventoryClickEvent arbeitest, dort kannst du alles dazu überprüfen.
     
    #6
  7. Masterfran99
    Offline

    Masterfran99 Gesperrt

    Registriert seit:
    13. Oktober 2012
    Beiträge:
    100
    Sorry em WaveMC du hast das leider falsch verstanden.
    Ich möchte das der Block Bedrock nicht gebaut werden kann.
    Du hast mir geschrieben das wenn man einen Anvil abbauen will das es nicht geht.
     
    #7
  8. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Den Block, auf den ein Spieler schaut, bekommst du mit Player.getTargetBlock() (Deprecated), damit kannst du aber kein Entity bekommen.
    @delta242: Habe ich bereits geschrieben. Und mit dem Scheduler jeden Tick jedes inventar zu durchsuchen, braucht viel zu viel Performance.

    Wenn der Block nicht gesetzt werden darf, musts du das BlockPlaceEvent benutzen.
     
    #8
  9. Masterfran99
    Offline

    Masterfran99 Gesperrt

    Registriert seit:
    13. Oktober 2012
    Beiträge:
    100
    und nochwas gut das du da bist:
    Code (Text):
    1.                             MainClass.instance.scheduler = Bukkit.getScheduler().scheduleSyncRepeatingTask(this.plugin, new Runnable() {
    2.                                
    3.                                 @Override
    4.                                 public void run() {
    5.                                     Random r = new Random();
    6.                                     final int i = r.nextInt(8);
    7.                                     if(i == 0){            
    8.                                         w.dropItem(loc, new ItemStack(Material.CLAY_BRICK));
    9.                                     }else if(i == 1){
    10.                                         w.dropItem(loc, new ItemStack(Material.CLAY_BRICK));
    11.                                     }else if(i == 2){  
    12.                                         w.dropItem(loc, new ItemStack(Material.CLAY_BRICK));
    13.                                     }else if(i == 3){
    14.                                         w.dropItem(loc, new ItemStack(Material.IRON_INGOT));
    15.                                     }else if(i == 4){  
    16.                                         w.dropItem(loc, new ItemStack(Material.GOLD_INGOT));
    17.                                     }else if(i == 5){  
    18.                                         w.dropItem(loc, new ItemStack(Material.IRON_INGOT));
    19.                                     }else if(i == 6){  
    20.                                         w.dropItem(loc, new ItemStack(Material.CLAY_BRICK));
    21.                                     }else if(i == 7){  
    22.                                         w.dropItem(loc, new ItemStack(Material.CLAY_BRICK));
    23.                                         }
    24.                                 }
    25.                             }, 1L, 12L);
    Das ist mein Scheduler nur was muss ich ändern das ich mit Klasse.<scheduler><stoppen> benutzen kann?
     
    #9
  10. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    "Das ist mein Scheduler nur was muss ich ändern das ich mit Klasse.<scheduler><stoppen> benutzen kann?"
    Noch einmal, aber bitte etwas verständlicher. :p

    Außerdem sollte deine MainClass nicht MainClass, sondern so, wie dein Plugin heißt, heißen.
     
    #10
  11. Masterfran99
    Offline

    Masterfran99 Gesperrt

    Registriert seit:
    13. Oktober 2012
    Beiträge:
    100
    Ich habe da grade noch ein Problem gefunden:

    Ich finde nix wie ich im BlockBreakEvent bunte Wolle definiere ich habe es mit DyeColor und new Item Stack aber es kann garkein ItemStack sein weil die Anzahl z.b. man kann ja nur 1 Block gleichzeitig abbauen.

    Code (Text):
    1.     @EventHandler
    2.     public void kacka(BlockBreakEvent e){
    3.         Block b = e.getBlock();
    4.         Player p = e.getPlayer();
    5.         if(ArrayLists.Rush.contains(p)){
    6.             if(b.getType().equals(Material.WOOL)){
    7.                 Wool w = (Wool)b;
    8.                 w.setColor(DyeColor.RED);
    9.                 Wool wb = (Wool)b;
    10.                 w.setColor(DyeColor.BLUE);
    11.                 if(ArrayLists.RushRed.contains(p)){
    12.                     if(b.getType().equals(w)){
    13.                     e.setCancelled(true);
    14.                     }
    15.                 }else if(ArrayLists.RushBlue.contains(p)){
    16.                     if(b.getType().equals(wb)){
    17.                         e.setCancelled(true);  
    18.                     }
    19.                 }
    20.  
    21.                
    22.                
    23.                
    24.                
    25.             }
    Es kommt die Meldung das Wool w = (Wool)b; falsch ist :(

    - - - Aktualisiert - - -

    Warum wie mein Plugin heißen?
    Also ich möchte mit einer anderen Klasse auf den Scheduler zugreifen also z.b. Scheduler ist in der Klasse Scheduler.class aber in der Klasse Ende.class möchte ich ihn stoppen.
     
    #11
  12. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Dann musst du die ID in einer Variable der Klasse speichern, aus der du den Scheduler stoppen willst oder aus der Klasse, mit der du den Scheduler stoppen willst auf die Variable der Klasse mit dem Scheduler zugreifen, in der die ID des Schedulers gespeichert ist.
     
    #12
  13. Masterfran99
    Offline

    Masterfran99 Gesperrt

    Registriert seit:
    13. Oktober 2012
    Beiträge:
    100
    Ok ich habe jetzt in der Klasse oben public static int schedulerr = 0;
    Die Klasse heißt: DropListener
    Wenn ich in einer anderen Klasse DropListener.schedulerr schreibe geht es zwar nur da schedulerr als rot unterstrichen wird und es nicht weiter geht also wie stoppe ich den?

    danke schonmal
     
    #13
  14. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    #14
  15. Masterfran99
    Offline

    Masterfran99 Gesperrt

    Registriert seit:
    13. Oktober 2012
    Beiträge:
    100
    Danke klappt ich habe aber statt -1 einfach 0 genommen.
    Nun brauche ich folgendes damit mein Minigame fertig ist ich versteh nicht wie ich bunte wolle definiere mit ItemStack gehts nicht mit Wool w = plaplapla gehts auch nicht.

    Beim BlockBreakEvent soll etwas besonderes passieren wenn man bunte Wolle abbaut.
    Und wenn man z.b. einen Befehl benutzt soll an einer bestimmten Stelle ein bunter Wolleblock entstehen nur leider klappts nicht D:

    Code (Text):
    1.                     Location loc = new Location(p.getWorld(), 830, 40, 349);
    2.                     Wool w = (Wool)loc.getBlock();
    3.                     w.setColor(DyeColor.RED);
    Damit sollte doch dann an der Location ein Block gemacht werden.
     
    #15
  16. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    -1 zeigt meistens an, dass es keinen Fehler gibt. In dem Fall wurde der Scheduler noch nicht gestartet. In der Methode, mit der du den Scheduler stoppst, wird überprüft, ob die Scheduler ID aus deiner Scheduler-Start-Klasse schon geändert, bzw. größer oder gleich 0 ist. Nur dann wird der Scheduler gestoppt, da du einen Scheduler nicht stoppen kannst, wenn dieser nicht gestartet wurde.

    Zu deinem Wolleproblem:
    Code (Text):
    1.  
    2. Block block = loc.getBlock();
    3. block.setType(Material.WOOL);
    4. block.setData(DyeColor.RED.getData());
    5.  
     
    #16
  17. Masterfran99
    Offline

    Masterfran99 Gesperrt

    Registriert seit:
    13. Oktober 2012
    Beiträge:
    100
    ok danke klappt nur bei dem mit den Bedrock in Inventaren wieso passiert nix im Kreativ INventar erst wenn ich auch die eigene Item Leiste etwas lege kommt die nachricht nur das item wird nicht zurück gesetzt es soll am besten zu 0 air oder so gemacht werden sobald man bedrock anklickt.
     
    #17
  18. Masterfran99
    Offline

    Masterfran99 Gesperrt

    Registriert seit:
    13. Oktober 2012
    Beiträge:
    100
    Noch etwas zu Economy/Vault
    Code (Text):
    1. lore2.add(econ.getBalance(p.getName()));
    add wird rot unterstrichen.
    ich möchte es so haben das in der lore halt das geld des spielers steht aber nur für den spieler nicht öffentlich.
    Wie mache ich das oder eher was muss ich ändern?
     
    #18