# Minecraft Spigot-Plugin | Schusswaffe programmieren



## NewJavaDeveloper (11. Apr 2020)

Guten Tag zusammen!

Ich sitze nun schon seit etwas längerer Zeit an einem Minecraft-Plugin, welches den Spielmodus "Paintball" ermöglichen soll.
Ich bin nun an einer Position angelangt, an der ich eine Minigun programmieren möchte, welche mehrere Geschosse auf einmal feuert, jedoch am besten ohne Verzögerung. Um dies umzusetzen habe ich folgenden Code verwendet:


```
@SuppressWarnings("deprecation")
@EventHandler
public void onItemUse(PlayerInteractEvent e) {
    if (e.getItem() != null) {
    //Minigun
        if (e.getItem().getType() == Material.WOOD_PICKAXE) {
                        Player p = e.getPlayer();
                        for (int i = 0; i < 4; i++) {
                        String uuid = p.launchProjectile(Snowball.class).getUniqueId().toString();
                        Entity snowball = Bukkit.getEntity(UUID.fromString(uuid));
                        TraceEffect te = new TraceEffect (Main.effectManager);
                        te.setEntity(snowball);
                        te.start();
                        p.playSound(p.getLocation(), Sound.ENTITY_ENDERPEARL_THROW, 2, 2);
                        p.playSound(p.getLocation(), Sound.ENTITY_ENDERPEARL_THROW, 2, 2);
                        p.playSound(p.getLocation(), Sound.ENTITY_ENDERPEARL_THROW, 2, 2);
                        try {
                            TimeUnit.MILLISECONDS.sleep(50);
                        } catch (InterruptedException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                        }
                    }
        }
    }
    }
```

Mein Problem ist es jetzt, dass der Server während der Verwendung der Minigun durch die ständigen kurzen Pausen anfängt zu hängen und alles total langsam wird.
Ich habe die Pause eingebaut, damit die Schussanimation besser aussieht und die Geschosse nicht als "gestackte/gehäufte Items" geschossen werden.
Kann mir jemand weiterhelfen, wie ich das Hängen des Servers unterbinden kann, oder besser gesagt, gibt es eine andere Pause, die man verwenden kann, ohne dass der Server für kurze Zeit "pausiert" wird?
Falls es auch komplett ohne Pause funktioniert, dass die Geschosse mit einer leichten Verzögerung (also nicht alle auf einmal) abgeschossen werden, würde das auch genügen.

Ich bedanke mich im Voraus für jede hilfreiche Antwort!


----------



## LimDul (11. Apr 2020)

Ohne die genauen Innereien zu kennen - du wirst vermutlich das gleiche Problem haben, wie bei GUIs.

Thread.sleep ist böse, weil du damit den ganzen Server lahmlegst, du musst also deine Schleife in einen eigenen Thread auslagern (ich weiß aber nicht, inwieweit es dann Probleme beim Zugriff auf die Server Resourcen gibt, bei Swing GUIs gibt es dafür SwingUtils.invokeXXX.


----------



## NewJavaDeveloper (11. Apr 2020)

LimDul hat gesagt.:


> Ohne die genauen Innereien zu kennen - du wirst vermutlich das gleiche Problem haben, wie bei GUIs.
> 
> Thread.sleep ist böse, weil du damit den ganzen Server lahmlegst, du musst also deine Schleife in einen eigenen Thread auslagern (ich weiß aber nicht, inwieweit es dann Probleme beim Zugriff auf die Server Resourcen gibt, bei Swing GUIs gibt es dafür SwingUtils.invokeXXX.



Kannst du mir diesbezüglich ein Beispiel schicken, wie das ganze am Ende aussehen könnte/sollte?


----------



## Lasnik (19. Mai 2020)

Ich bin Anfänger aber hatte ein ähnliches Problem, hier ist meine Lösung. Ich hoffe es hilft 

import java.util.Timer;
import java.util.TimerTask;
public void onReceivedMessage(ChatInputEvent event)
{
Timer timer = new Timer();
timer.schedule(new TimerTask() {
//dein Programm
},2*1000);
}

Das Programm wartet 2 Sekunden, bevor es dies ausführt ohne den ganzen Server zu stoppen


----------

