# Minecraft Plugin, welches nur bestimmten Block zum bebauen festlegt



## AkenoBot (3. Jun 2019)

Sehr geehrtes Forum,

momentan programmiere ich ein Plugin, welches grundsätzlich das Bauen mit dem Banner verbietet. Dennoch habe ich eine Ausnahme hinzugefügt, welche das Bauen auf Bedrock erlaubt und ein Event auslöst. Dennoch klappt das nicht so ganz. Hier ist der Code:
siehe bild1


und eben das gegenstück zum allgemeinem Verbieten:

siehe bild2

Ich bekomme eben keine Fehlermeldung, aber es klappt ingame nicht. 

LG


----------



## Robat (3. Jun 2019)

Eine if-Abfrage solltest du nicht mit einem Semikolon beenden


----------



## mrBrown (3. Jun 2019)

Poste den Code doch bitte als Text innerhalb von Code-Tags ([code=java]...dein code...[/code])


----------



## AkenoBot (3. Jun 2019)

mrBrown hat gesagt.:


> Poste den Code doch bitte als Text innerhalb von Code-Tags ([code=java]...dein code...[/code])



Okay hier nochmal der Code:

(
	
	
	
	





```
//Standing-Banner Einnahme
   
    @EventHandler (priority = EventPriority.HIGH)
    public void onBanner(BlockPlaceEvent event3) {
       
        Player p2 = event3.getPlayer();
       
        if(!p2.hasPermission("nostanding_banner.bypass"));
           
        Block block = event3.getBlockPlaced();
       
       
       
        if(block.getType() == Material.STANDING_BANNER) {
            Block blockbelow = block.getWorld().getBlockAt(block.getX(), block.getY() - 1, block.getZ());
           
           
            if (blockbelow.getType() == Material.BEDROCK);
           
            event3.setCancelled(false);
            p2.sendMessage(ChatColor.RED + "Niceu");
           
            }
   
        }
```
)

und der Zweite
(
	
	
	
	





```
}   
    //Banner-Protection
       
    @EventHandler (priority = EventPriority.HIGHEST)    
    public void onBannerBanner(BlockPlaceEvent event5) {
       
        Player p4 = event5.getPlayer();
       
        Block block = event5.getBlockPlaced();
       
        if(block.getType() == Material.STANDING_BANNER) {
           
            event5.setCancelled(true);
           
            p4.sendMessage(ChatColor.RED + "Du kannst hier kein Gebiet einnehmen!");
           
        }
       
    }
```
)


----------



## AkenoBot (3. Jun 2019)

Robat hat gesagt.:


> Eine if-Abfrage solltest du nicht mit einem Semikolon beenden


naja, wenn ich das anders beende, bekomme ich errors :/


----------



## Robat (3. Jun 2019)

Dann solltest du mit Minecraft Plugin Programmierung aufhören und dir ein Grundlagenbuch schnappen.

Du kochst ja auch kein 4 Gänge Menü, wenn du nicht weißt, wie du dir ein Brot schmierst 


Back to Topic:
Was für Fehler kommen denn. Eine if Abfrage sieht abstrakt so aus

```
if( <Bedingung> ) {
   <Anweisungen>
}
```


----------



## AkenoBot (3. Jun 2019)

Robat hat gesagt.:


> Dann solltest du mit Minecraft Plugin Programmierung aufhören und dir ein Grundlagenbuch schnappen.
> 
> Du kochst ja auch kein 4 Gänge Menü, wenn du nicht weißt, wie du dir ein Brot schmierst
> 
> ...



habe dies jetzt einmal korrekt wieder aufgeschrieben, habe auch keine Fehler mehr. Dennoch funktioniert es immer noch nicht so wie es soll.


----------



## mihe7 (4. Jun 2019)

Wie sieht Dein Code jetzt aus?


----------



## AkenoBot (4. Jun 2019)

mihe7 hat gesagt.:


> Wie sieht Dein Code jetzt aus?



das ist der aktuelle code. Ich habe keine Fehlermeldung, aber irgendetwas muss ich übersehen haben, damit das im Spiel auch passiert.


```
//Standing-Banner Einnahme
	   
    @EventHandler (priority = EventPriority.HIGH)
    public void onBannerBannerB(BlockPlaceEvent event9) {
       
        Player p2 = event9.getPlayer();
       
        if(!p2.hasPermission("nostanding_banner.bypass"));
           
        Block block = event9.getBlockPlaced();
       
       
       
        if(block.getType() == Material.STANDING_BANNER) {
            Block blockbelow = block.getWorld().getBlockAt(block.getX(), block.getY() - 1, block.getZ());
           
           
            if (blockbelow.getType() == Material.BEDROCK);{
           
            event9.setCancelled(false);
            p2.sendMessage(ChatColor.RED + "Du nimmst ein Gebiet ein!");
           
            }
   
        }
	}
```


und der andere


```
//Banner Protection
	
	
	@EventHandler (priority = EventPriority.HIGH)
	public void onStanding(BlockPlaceEvent event4) {
		
		Player p3 = event4.getPlayer();
		
		if(!p3.hasPermission("nostanding_banner.bypass"));
		
		Block block = event4.getBlockPlaced();
		
		if(block.getType() == Material.STANDING_BANNER) {
			
			event4.setCancelled(true);
			
			p3.sendMessage(ChatColor.RED + "Du kannst hier kein Gebiet einnehmen!");
			
		}
			
		
		
	
	    
	}
```


----------



## thecain (4. Jun 2019)

AkenoBot hat gesagt.:


> if(!p3.hasPermission("nostanding_banner.bypass"));


Inwiefern hast du das jetzt gefixed?


----------



## AkenoBot (4. Jun 2019)

thecain hat gesagt.:


> Inwiefern hast du das jetzt gefixed?


 mir wurde gesagt, dass diese Zeile sowieso keinen Einfluss hat, kann man also auch weglassen.


----------



## mrBrown (4. Jun 2019)

Da ist ja jetzt sogar ein kaputtes if mehr (allerdings ist es auch eine andere Methode als vorher...)


----------



## mrBrown (4. Jun 2019)

AkenoBot hat gesagt.:


> mir wurde gesagt, dass diese Zeile sowieso keinen Einfluss hat, kann man also auch weglassen.


Na, dann lass sie doch weg?

Das Problem des mit Semikolon beendeten if's bleibt trotzdem.


----------



## mihe7 (4. Jun 2019)

AkenoBot hat gesagt.:


> if (blockbelow.getType() == Material.BEDROCK);{


Dir ist klar, dass auch diese Abfrage keinen Einfluss auf die Ausführung Deines Programms hat?


----------



## AkenoBot (4. Jun 2019)

mihe7 hat gesagt.:


> Dir ist klar, dass auch diese Abfrage keinen Einfluss auf die Ausführung Deines Programms hat?


bist du sicher? Da, wenn ich ein Bedrock block auf den Boden setze, im Spiel die Message im Chat angezeigt wird


----------



## mrBrown (4. Jun 2019)

Die Meldung kommt bei egal welchem Material.


----------



## mihe7 (4. Jun 2019)

Ja, sofern getType() keine Exception wirft. Dein Code ist nichts anderes als:

```
if (blockbelow.getType() == Material.BEDROCK) 
  ;
{
    event9.setCancelled(false);
    p2.sendMessage(ChatColor.RED + "Du nimmst ein Gebiet ein!");
}
```
Die geschweiften Klammern beginnen nur einen neuen Block, die kannst Du auch weglassen:

```
if (blockbelow.getType() == Material.BEDROCK) 
  ;
event9.setCancelled(false);
p2.sendMessage(ChatColor.RED + "Du nimmst ein Gebiet ein!");
```


----------



## AkenoBot (4. Jun 2019)

Also ich hoffe, dass ihr versteht, was ich meine. Die Protection im Spiel funktioniert mit dem Banner, wenn alle

```
setCancelled(true);
```
 sind.

Aber die Ausnahme soll ja der Bedrock block sein.


----------



## AkenoBot (4. Jun 2019)

mihe7 hat gesagt.:


> Ja, sofern getType() keine Exception wirft. Dein Code ist nichts anderes als:
> 
> ```
> if (blockbelow.getType() == Material.BEDROCK)
> ...



verstehe verstehe.


----------



## mihe7 (4. Jun 2019)

AkenoBot hat gesagt.:


> verstehe verstehe.


Sicher? Wie sieht Dein Code jetzt aus?


----------



## AkenoBot (4. Jun 2019)

mihe7 hat gesagt.:


> Sicher? Wie sieht Dein Code jetzt aus?




```
if (blockbelow.getType() == Material.BEDROCK);
           
            event9.setCancelled(false);
            p2.sendMessage(ChatColor.RED + "Du nimmst ein Gebiet ein!");
```


----------



## mrBrown (4. Jun 2019)

Dein Code ist effektiv das gleiche wie:

```
boolean __ = blockbelow.getType() == Material.BEDROCK;

event9.setCancelled(false);
p2.sendMessage(ChatColor.RED + "Du nimmst ein Gebiet ein!");
```


----------



## SchmidiMC (4. Jun 2019)

Warum mit der Spigot API programmieren wenn man von Java keinen Dunst hat


----------



## temi (4. Jun 2019)

Ich will es mal kurz machen, obwohl es bereits mehrfach erwähnt wurde.

Eine if-Anweisung sieht ungefähr so aus:


```
if (Bedingung) {
    dann tu was;
    und noch was;
    und noch was;
}
```

Wenn nur *eine* Anweisung folgt, dann muss diese nicht in geschweiften Klammern stehen:


```
if (Bedingung) dann tu was; // Beachte das Semikolon, das die Anweisung abschließt
```

Deine if-Anweisungen verzichten auf den "dann tu was" Teil, weil sie sofort mit einem Semikolon abschließen.


```
if (Bedingung); hier wird immer was getan; // Beachte das Semikolon, das direkt nach der if-Anweisung diese abschließt
```


----------



## AkenoBot (6. Jun 2019)

SchmidiMC hat gesagt.:


> Warum mit der Spigot API programmieren wenn man von Java keinen Dunst hat


so ich habe es jetzt selbst herausgefunden. Zuerst einmal habe ich nie behauptet, dass ich bereits irgeine ahnung davon habe. Da es so ein Plugin aber nicht gibt, musste ich selbst ran. Du kannst dir diesen kommentar also gerne sparen. Nun hier die Lösung:

Davor muss noch eine Bedingung eingefügt werden:


```
if(block.getBlockData().getMaterial().toString().contains("BANNER")) {
```


----------



## mrBrown (6. Jun 2019)

Erstmal war das Problem am ganzen bisherigen Code, dass du die if's nicht vernünftig geschrieben hast...


----------



## AkenoBot (6. Jun 2019)

mrBrown hat gesagt.:


> Erstmal war das Problem am ganzen bisherigen Code, dass du die if's nicht vernünftig geschrieben hast...


und das habe ich gecheckt und richtig aufgeschrieben, danke für den hinweis.


----------

