• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

Plugin für Roleplay Server (Brauche Hilfe) Bewusstlos

abcabc

Redstoneengineer
Registriert
2 Mai 2018
Beiträge
35
Diamanten
250
Hallo Mein Name ist NiciToni
und ich brauche Hilfe für ein Plugin. Ich bin kein Profi-Programmierer und kenne mich auch nicht so aus
ich würde gerne ein Plugin schreiben für die 1.14.4 das man wenn man getötet wird nicht stirbt und bewusstlos ist man kann nun nicht mehr schreiben laufen und hüpfen nach 400 Sekunden stirbt man. Hat vllt jmd einen Ratschlag welchen Listener ich benutzen könnte? Kann sein das ein paar Rechtschreibfehler dabei sind... Liebe Grüsse NiciToni
 

BloodSKreaper

Vorarbeiter
Registriert
12 Oktober 2014
Beiträge
249
Diamanten
316
Minecraft
BloodSKreaper
Guten Abend,

wenn du verhindern willst, dass ein Spieler stirbt, dann musst du abfragen ob ein Spieler sterben würde, wenn er Schaden erhält. Dafür könntest du das EntityDamageEvent verwenden und wenn der Spieler sterben würde diesen in den Bewusstlos Zustand versetzen. Das heißt, dass du diesen zum Beispiel in ne Liste packst und beim Ablauf der Zeit wieder entfernst und den Spieler tötest. Bei ner Bewegung des Spielers kann diese gecannceled werden, sobald dieser sich bewegt.

Freundliche Grüße
BloodSKreaper
 

abcabc

Redstoneengineer
Registriert
2 Mai 2018
Beiträge
35
Diamanten
250
So funktioniert es nicht (Ich bin noch kein erfahrener Spieler bitte verzeiht mir :D) Ich hab es erstmal etwas einfaches ausprobiert
So klappts nicht Listener:
package me.nicitoni;

import org.bukkit.Bukkit;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;

public class Bewussltlos implements Listener {
    private int taskID;
    public void onPlayHit(EntityDamageEvent e) {
        if(e.getEntity().getType() == EntityType.PLAYER) {
            Player p = (Player) e.getEntity();
            if(p.getHealth() == 0) {
                p.setHealth(1);
                p.sendMessage("§4Du bist bewusstlos, warte auf Rettung");
                p.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 1000000, 1000000000));
               
               
                Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.getPlugin(), new Runnable() {
                    int count = 100;
                    @Override
                    public void run() {
                    count -= 1;
                    if(count == 0) {
                        p.setHealth(0);
                        Bukkit.getScheduler().cancelTask(taskID);
                    }
                       
                    }
                }, 0, 20);
            }
        }
    }

}
 
Zuletzt bearbeitet:

petomka

Redstoneengineer
Registriert
8 Oktober 2012
Beiträge
41
Alter
26
Diamanten
322
Hallo,

ohne jetzt genau zu verstehen was du nun eigentlich genau vorhast, habe ich trotzdem ein paar Verbesserungsvorschläge für dich:
  • Die EventHandler Annotation fehlt
  • Am besten EventPriority HIGHEST (bevor dein Code aufgerufen wird, sollten alle anderen Plugins bereits ihre Behandlung gemacht haben)
  • Eine bessere Überprüfung in dem Event wäre, ob player.getHealth() - event.getFinalDamage() <= 0 zu true auswertet und das Event daraufhin canceln (sonst stirbt der Spieler ggf. trotzdem)
  • Damit ist if(player.getHealth == 0) hinfällig
  • Momentan würde jedes Mal, wenn die oben formulierte Bedingung zu wahr auswertet, ein neuer Task gestartet werden, der sich sofort startet, dann jede Sekunde aufgerufen wird, einen Zähler solange verringert, bis dieser null ist, um dann etwas zu machen und sich selbst zu beenden. Das ist Unsinn:
    • Ein Task, der nach 400*20 Ticks läuft, ist völlig ausreichend
    • Da dieser Task nur einmal laufen soll, reicht es, diesen mit Bukkit#runTaskLater(Plugin, Runnable, long) zu starten
    • Du solltest in einer Map speichern, für welchen Spieler bereits welcher Task läuft, um nicht noch einen weiteren zu starten und laufende Tasks gezielt beenden zu können
  • (Meiner Meinung nach) schönerer Programmierstil ist es, möglichst wenig Einrückung zu erzeugen und möglichst kleine Blockstrukturen zu bauen. Das erzeugt lesbareren und wartbareren Code. Code lässt sich immer umformen; hier mal musterhaft so:
    Java:
    @EventHandler(priority = EventPriority.HIGHEST)
    public void onDamage(EntityDamageEvent event) {
        if (event.getEntity().getType() != EntityType.PLAYER) {
            return;
        }
        /*Weiter hier*/
    }
  • Du brauchst eine Behandlung für Spieler, die Schaden bekommen, aber bereits bewusstlos sind.
    • Dieser Schaden muss entweder negiert werden, und bewusstlose Spieler sind unverwundbar, bis sie dadurch sterben.
    • Soll ein bewusstloser Spieler aber weiterhin verwundbar sein, und durch weiteren Schaden sterben, so muss ein laufender Task für einen bewusstlosen Spieler beendet werden und dieser aus obiger Menge entfernt werden.
    • Laufende Tasks für bewusstlose Spieler müssen sowieso jederzeit beendet werden können, denn wenn der Spieler Hilfe erhalten hat, soll er ja nicht ein paar Sekunden später tot umfallen. Siehe Map weiter oben.
  • Falls du etwas von den Vorschlägen, die ich dir gemacht habe, noch nicht verstehen solltest, bietet es sich an, immer erst zu googlen, bevor man weitere Fragen stellt. Es gab schon tausend andere Leute vor dir mit dem gleichen Problem, entsprechend viele Lösungen sind im Netz zu finden (z.B. "Java Liste machen" oder "Java Map"). Die Fähigkeit, sich Wissen selbst beschaffen und aneignen zu können, ist essentiell. Zumindest das Beschaffen von Informationen ist denkbar einfach.
 
Oben