Gungame Spieler ins Wasser schlagen?

2 Antworten

Entschuldigung für die späte Antwort, habe deine Frage wohl übersehen ;)

Das ist wahrscheinlich einer der schwersten Teile des Gungame-Plugins, deshalb wird dieser Beitrag etwas länger.

Als Erstes benötigst du das EntityDamageByEntityEvent. Dort musst du erstmal abfragen, ob das e.getEntity() und der e.getDamager() instanceof Player sind. Sollte dies der Fall sein, wurde ein Spieler von einen Spieler geschlagen. Anschließend castest du den Damager und das Entity zum Spieler. Die speicherst du dann in einer HashMap<Player, Player>, wobei das Entity der erste Spieler ist und der Damager der Zweite. Danach legst du eine zweite HashMap<Player, Long> an, der Spieler ist das e.getEntity(), der long ist

System.currentTimeMillis() + 3000

, damit du die aktuelle Zeit in Millisekunden erhälst und 3000 (3 Sekunden) addierst. Später soll man nur Level kriegen, wenn der Gegner innerhalb von 3 Sekunden nach dem Schlag ins Wasser kommt (kannst du natürlich anpassen).

Den nächsten Schritt kannst du entweder mit dem PlayerMoveEvent oder einem Runnable machen, wobei das PlayerMoveEvent Lags verursachen kann.

    HashMap<Player, Player> hits = new HashMap<>();
    HashMap<Player, Long> time = new HashMap<>();

    @EventHandler
    public void onMove(PlayerMoveEvent e) {
        Player p = e.getPlayer();
        if(p.getLocation().getBlock().getType() == Material.WATER) {
            //Setze den Spieler zum Spawn
            if(hits.containsKey(p)) {
                if(time.get(p) < System.currentTimeMillis()) {
                    Player d = hits.get(p);
                    time.remove(p);
                    hits.remove(p);
                    //Gebe Spieler d besseres Equip
                }
            }
        }
    }

wäre eine mögliche Lösung, wenn auch schlecht von Gutefrage formatiert... Kurz zusammengefasst: Wenn sich der Spieler in Wasser befindet und innerhalb der letzen 3 Sekunden geschlagen wurde, bekommt der Gegner ein besseres Level. Allerdings bekommt er momentan noch kein besseres Level, darum kümmern wir uns im nächsten Absatz ;)

Dazu erstellst du dir eine sehr große Methode, die z.B. so aufgebaut ist:

    public static void setLevel(Player p, int level) {
          p.getInventory().clear();
          switch(level) {
              case 1:
                  p.getInventory().addItem(new ItemStack(Material.WOOD_SWORD));
                  p.getInventory().setChestplate(new ItemStack(Material.LEATHER_CHESTPLATE));
                  break;
              case x:
                  //...
          }
          p.updateInventory();
          p.setLevel(level);
          p.sendMessage("§aDu bist nun Level " + level + "!");
      }
  

So sollte der Code auch schon funktionieren :)

Viel Spaß! ;)

Seliba

P.S.: Sollte etwas nicht funktionieren oder du hast Fragen, kannst du gerne einen Kommentar schreiben :)

Woher ich das weiß:Hobby – Minecraft-Spieler seit 2016 und Minecraft-Fan seit 2013

Ich nehme an, dass du einen Spieler, der ins Wasser fällt tötest oder teleportierst.

Falls nicht:

Benutze das PlayerMoveEvent um abzufragen ob auf der Position des Spielers der Block Wasser zu finden ist.

In diesen Code kannst du dann mit PlayerObject.LastDamagedBy() meines wissen ein Entity erhalten, dass dem Spieler zuletzt schaden zugefügt hat. Falls es die Methode gar nicht gibt:

Erstelle eine HashMap mit <Player, Player>. Der 1. Spieler ist der Schaden-Bekommende. der 2. Spieler der ihm Schaden gemacht hat. Und trage im PlayerDamageEvent oder EntityDamgeByEntityEvent immer den neusten Spieler ein.

Optional kannst du noch eine 2. HashMap laufen haben mit <Player, Long> wobei Long für den Zeitpunkt des letzten Schadens durch einen Spieler steht. So kannst du verhindern, dass ein Spieler den anderen schlägt. Dieser nicht runter fällt dadurch aber 30sek. später durch eigenene Schuld falsch springt und ins Wasser fällt.

Die HashMaps sollten beim PlayerQuitEvent passent "gereinigt" werden.

LG Sprax2013 :)

Woher ich das weiß:Hobby – Mehrere Jahre Spiel- und Programmiererfahrung

Seliba  04.03.2018, 11:55

Exakt ^^

0