ServerPlugin User vom Fadenkreuz bekommen

Dieses Thema im Forum "Programmierung" wurde erstellt von feuerkralle2011, 25. August 2013.

  1. feuerkralle2011
    Offline

    feuerkralle2011

    Registriert seit:
    3. Januar 2013
    Beiträge:
    26
    Minecraft:
    feuerkralle2011
    Hallo Liebe Community,
    Wie die Überschrift schon sagt suche ich eine Methode einen User der im Fadenkreuz ist zu ermitteln.
    Das heißt im Grunde Spieler A sieht Spieler B gibt einen Command ein und Spieler B bekommt z.b. Leben abgezogen.

    Ich habe mich damit nun seit ein paar Tagen beschäftigt finde aber nur eine Funktion die Blöcke die im Fadenkreuz sind bekommt.
    Würde mich über Hilfe freuen.

    Mit freundlichen Grüßen feuerkralle2011
     
    #1
  2. Galliar12
    Offline

    Galliar12

    Registriert seit:
    16. Juli 2011
    Beiträge:
    85
    Minecraft:
    Galliar12
    Vlt mit player.getEyeLocation() versuchen welches eine LivingEntity wiedergibt und dann schauen ob diese Entity ein Player ist?

    Also
    Code (Text):
    1. Player p = (Player)cs;
    2. Entity e = p.getEyeLocation();
    3. if (e instanceof Player) {
    4. Player target = (Player) e;
    5. }
    Hoffe das hilft dir weiter :)
    Code wurde von mir nicht getestet
     
    #2
  3. Chrisliebaer
    Online

    Chrisliebaer

    So weit ich weiß, bietet Bukkit dafür auch keine Möglichkeit. Ich habe auch noch nie ein Plugin gesehen, dass das verwendet.

    Daher wirst du wohl nicht daran vorbei kommen das selbst zu implementieren. Ich kenn jetzt keinen Algorithmus, der so etwas kann, daher einfach mal eine Vermutung, wie man das am effektivsten machen könnte.

    1. Maximale Reichweite festlegen.
    2. Alle potentiellen Spieler innerhalb dieser Reichweite in eine Liste aufnehmen

    Den Blick des Spielers kann man als Gerade betrachten. Nun zerlegen wir die Welt in ihre Achsen. Also wir "schneiden" die Welt jeweils an genau der Stelle des Ursprünglichen Spielers, also der, der den Command eingegeben hat durch.

    Dabei erhält man 3 Ansichten: Eine Draufsicht, eine Ansicht von "Vorne" und eine Ansicht von der "Seite". Nun musst du deine Linie für diese 3 Ebenen aufteilen, so dass du eine Funktion hast, die deine Linien in jeder dieser Ebenen beschreibt.

    Und ab hier wird einfach nurnoch Mathematik verwendet. Du berechnest den Wert deiner Funktion für jede Ebene an der Stelle jedes Spielers in deiner Liste und checkst dabei, ob dieser Wert innerhalb einer gewissen Tolleranz liegt, die die Breite der Spielerentity entspricht.

    Wenn dies der Fall ist, prüfst du für die nächste Ebene, wenn nicht, kannst du die restlichen Ebenen überspringen und zum nächsten Spieler geben.

    Keine Ahnung, ob das verständlich war, ich denke mal eher nicht. Die Lösung erfordert einiges an räumlicher Vorstellung und eigentlich auch ein bisschen Erfahrung mit solchen Berechnungen. (Daher gibt es das vermutlich auch nicht in Bukkit :p)

    Ich hab sowas aber noch nie gemacht, kann sein, dass es eine einfachere Lösung gibt.

    - - - Aktualisiert - - -

    Les nochmal genau die Dokumentation, das gibt dir nur die Location der Augen der Enitity wieder. Das braucht er zwar für die Berechnung auch, aber so wie du dir das vorstellst geht das absolut nicht.
     
    #3
  4. feuerkralle2011
    Offline

    feuerkralle2011

    Registriert seit:
    3. Januar 2013
    Beiträge:
    26
    Minecraft:
    feuerkralle2011
    Ich habe diesen Code mal getestet dies Funktioniert nicht da man eine Location nicht zu einem Entity casten kann.

    MFG

    - - - Aktualisiert - - -

    Danke Chris,
    Dies hört sich aber leider für mich zu umständlich an.Daher habe ich mir jetzt mal die Methode mit p.throwsnowball(); angeschaut.
    Dies kann man dafür doch nutzen oder? Dann bleib aber nur noch eine Frage wie lasse ich den Schneeball bis zum Player fliegen da
    Schneebälle ja nach einer gewissen anzahl von Blöcken runterfallen.

    MFG
     
    #4
  5. ChunkNorris
    Online

    ChunkNorris

  6. Chrisliebaer
    Online

    Chrisliebaer

    #6
  7. ChunkNorris
    Online

    ChunkNorris

    :(


    *zehnzeichen*
     
    #7
  8. feuerkralle2011
    Offline

    feuerkralle2011

    Registriert seit:
    3. Januar 2013
    Beiträge:
    26
    Minecraft:
    feuerkralle2011
    Gibt es dafür auch keine Methode? Das währe schade den dann könnte ich dies nicht umsetzen.:(
     
    #8
  9. delta242
    Offline

    delta242

    Registriert seit:
    28. Mai 2012
    Beiträge:
    90
    Also, wenn man sich nicht mit Vektoren auseinandersetzen will (was btw hier ganz "gut" erklärt wird: http://www.youtube.com/watch?v=TzaYsyNvvZA :D ) kann man es auch mit der Methode .getTargetBlock(...) von LivingEntity versuchen.
    Die Methode hat als 1. Parameter ein Byte-HashSet, in die man alle Block-IDs eintragen muss, welche transparent sein sollen. In unserem Fall können wir es auf null setzen, da ja nur AIR transparent sein soll. Als 2. Parameter trägt man die Reichweite an, ich würd sie nicht zu kurz einstellen.
    Wenn man jetzt den Target-Block hat, dann holt man sich von ihm die Location und überprüft, ob sich in der Nähe Spieler befinden. Diese trägt man in eine Liste ein und hat theoretisch die Spieler, auf die der Spieler guckt.
    Betonung liegt auf 'theoretisch', denn die Methode sucht halt nach einem Block und wenn ein Spieler jetzt quasi nur durch einen Spieler durchguckt und erst in 100 Blöcken dahinter der nächste Block ist, dann funktioniert das ganze nicht wirklich.
    Aber so ist vielleicht ein Ansatz :)
    Grüße, delta242

    PS: Hier noch mal die getTargetBlock(..) genauer erklärt


    --------- Edit ------------

    Hab eben die javadoc von Bukkit mir noch mal angeschaut und folgedes gefunden: http://jd.bukkit.org/rb/doxygen/d4/d7b/interfaceorg_1_1bukkit_1_1entity_1_1LivingEntity.html#a03e2192e3c89529d1f59ec5ce04370ba

    Das ist quasi das gleiche wie getTargetBlock(...), blos dass alle Blöcke in der Linie in einer Liste zurück gegeben werden. Damit sollte es eigentlich gut gehen. Einfach alle Blöcke durchgehen und schauen, ob ein Spieler in der nähe ist. Der erste Spieler, ist der Target-Player.
     
    #9