Beiträge von zM4xi

    Ich vermute mal mit einer anderen Klasse meinst du einen EventHandler der das Item anklicken regelt.


    Also zunächst musst du eine neue Klasse anlegen und dann folgendes hineinschreiben:

    Code
    1. public class InventoryClickListener implements Listener {
    2.     
    3. @EventHandler
    4. public void handleEvent(InventoryClickEvent event) {
    5. //TODO codey stuff
    6. }
    7. }


    Jetzt empfehle ich dir dir mal die Javadoc anzuschauen.

    https://hub.spigotmc.org/javad…/InventoryClickEvent.html

    Damit du weißt was du so machen kannst!


    Alles was du jetzt noch machen musst ist prüfen ob Rechts oder Links Klick und dann ob das Item das richtige ist. Und dann kannst du deinen Teleport ausführen!

    Also zur ersten Frage:


    An sich kann man das so machen. Einzige andere Option die mir jetzt noch einfallen würde wäre das Dokument zu BASE64 umzuwandeln und dann das einfach in die Datenbank schreiben jedoch kann ich mir vorstellen das es dabei zu Problemen kommen kann mit Bildern etc.


    Nun zur zweiten Frage:


    Grundsätzlich würde ich wenn du vorhast eine Detailierte Suche zu unterstützen eine Art Tag System empfhelen oder noch weiter gehen und jedes Stück mit einem Filter Dokument versehen.

    Hier mal wie ich mir das vorstelle:


    Ich habe habe ein Dokument zu Beethoven's 5 Symphonie im Ordner /Documents/Beethoven/

    Jetzt lege ich in ein zentrales Verzeichnis /Searches eine Json in welcher folgendes steht


    Wenn du jetzt nicht den Titel des Stückes weißt, kannst du einfach nach den Instrumenten oder nach den Jahren in denen es entstanden ist.

    Um die Suche performant zu machen empfehle ich jedoch nicht jedes mal alle .JSON zu laden und wieder zu entladen sondern dabei geht es eher darum das einfach nur zu speichern. Beim Start des Programmes speicherst du dir die Informationen einfach zwischen.


    Natürlich kannst du all die Informationen auch in ner relationellen Datenbank speichern. Persöhnlich tendiere ich aber eher zu JSON.

    Genau was du willst sind Packets die nur ein Spieler sieht! Das ist um einiges mehr Aufwand als ein einfacher NPC, weil du jede Bewegung "manuell" als Packet an den Client senden musst.


    Aus Gründen des Aufwandes rate ich hiervon ab. Es ist doch kein Armbruch wenn der NPC nur den Spieler anschaut der sich in der Nähe bewegt :D

    Aber solltest du darauf bestehen wollen. Solltest du dir mal das Grundkonzept von Packets anschauen, wie diese aufgebaut sind und welche es gibt. Mit etwas Recherche sollte das relativ gut machbar sein.


    ProtocolLib ist ein guter Anfang, damit hast du das Grundgerüst bereits gegeben. Jetzt müsstest du "nur noch" die Bewegungen selbst programmieren.

    Zu Beginn was hast du den schon, wie sieht dein Code bisher aus?

    Auch nützlich wären ein paar Informationen zum GUI was soll es können/anzeigen?

    Und wenn du deine "Bungeebridge" schon erwähnst sag doch ein paar Worte dazu, was genau die kann?


    Zum Konzept:

    Ich nehme jetzt einfach mal an du möchtest eine Art Auflistung/Darstellung aller Reports bzw der noch unbearbeiteten Reports und gehe davon aus du kannst OOP und verstehst den Grundaufbau eines solchen Konzeptes.


    Vermutlich der beste Weg wäre ein Inventar zu erstellen in dem die unterste Reihe reserviert ist für Navigation. (Erste Seite/Seite zurück/Seite vorwärts/Letzte Seite) um das zu realisieren brauchst du am besten einen Algorithmus der dir eine HashMap mit Seiten und einer Liste der enthaltenen Elemente zurückgibt.


    HashMap<Integer, List<Report>>


    Die Items solltest du am besten nicht jedesmal in ein neues Inventar legen, sondern ersetzte einfach die bereits vorhandenen.

    Alles weitere ist dann nur noch das Darstellen eines Reports bzw. das Ausführen der möglichen Aktionen (Teleport to Suspect/Message Suspect/etc)

    Ist das wirklich relevant? was soll überhaupt "Tube" sein? YouTube oder ist das irgendeine "Adult Site"?


    Überhaupt ich bin mir sicher dass das rechtlich schwer wird! Denn wie willst du die Webseite testen/prüfen/in Stand halten wenn du die Inhalte rechtlich gesehen nicht mal anschauen dürftest :D


    Naja was er will ist eine Video Streaming Platform mit erweiterbarem/bezahltem Zugang! In etwa wie Amazon Video, Netflix, maxdome. Warum er ein solch bizzares Beispiel dafür nutzt ist mir jedoch auch nicht klar :D

    Also ich würde dir gerne helfen jedoch müssen wir zuerst klären was genau du hier machst den, mir scheint so als hättest du noch nie mit einem Villager gehandelt!


    Aber um auf die Frage einzugehen.

    Um zu prüfen ob er die "Ware" im Inventar hat das hier: 'Inventory.contains()'

    Um die Items dann zu entfernen, gibt es leider seit Anbeginn der Zeit keine vernünftige remove() Methode, weswegen man das kompliziert per Hand machen muss :D

    Deswegen verwenden wir das hier: 'Inventory.all()'

    Ich kann dir aber nicht versichern das das 100 % so klappt hab es nicht getestet.

    Das weiß ich eben nicht an sich speichert das ItemStack[] ja nicht das Objekt selbst sondern die Referenz zu dem Objekt deswegen dachte ich mir das es vielleicht funktioniert :D Aber wie bereits gesagt keine Garantie :(

    So zunächst die Klasse ItemStackWithSlot:


    Damit kannst du einfach deine gewöhnlichen ItemStacks übernehmen bzw. direkt neue anlegen.

    Damit die auch ein Anwedungsbeispiel hast.


    Ich kann dir aber nicht versichern das das 100 % so klappt hab es nicht getestet.

    Wenn es den Slot nicht mit überträgt ins ItemStack Array des Inventares dann müsstet du das ganze einfach manuel per HashMap speichern;

    Ein "Mapping" bedeutet das du gewissermaßen einen Gegenstand virtualisierst . Oder anders gesagt du baust dir eine "Anleitung" wie etwas aussieht/zusammengebaut ist/welche Eigenschaften es hat/etc. Gerade bei ItemStack relativ schreibaufwändig wenn man es richtig machen will aber der wohl einfachste weg wäre folgender:


    WARNUNG: je nachdem wie du das speicherst sieht es nicht wirklich leserlich aus. bzw ist bei der Bukkit YAMLConfiguration nicht mal vollständig :(


    Wenn du jetzt anstatt reinen ItemStacks dieses Objekt speichert kannst du ganz einfach speichern auf welchem Slot das Item war/ist.


    Sollte dir OOP noch fremd sein oder du bist darin nicht sehr geübt rate ich einfach eine HashMap<Integer, ItemStack> ist schnell einfach und kann in einer Config gespeichert werden!

    Eigentlich nicht besonders kompliziert.

    Aber etwas Können gehört dazu :D


    Zuerst speicherst du am besten immer die Blocklocation der Kisten, dann zum sichern des Inhalt abfragen beim Öffnen von Kisten ob es eine der gespeicherten Locations ist, Ausnahme der Besitzter natürlich.


    Nun zum Schild, das Schild aktualisierst du am Besten bei jedem Ver- /Kauf und wenn der Inhaber die Kiste schließt. Somit sollte das Schild immer aktuelle Werte anzeigen.


    Um das Schild zu erstellen kannst du 2 wählen zwischen via Command oder direkt per Hand schreiben.

    Via Command hat den Vorteil du kannst das Schild nachträglich ändern ohne das man es erst abreißen und neuplatzieren muss.


    Per Schild ist eigentlich ja selbsterklärend, beim SignChangeEvent die Zeilen abfragen und nach den Informationen prüfen.


    Die Itemanzahl in der Kiste zählen geht indem du den Block der gespeicherten Location bekommst und dann checkst ob es ein Container ist (Keyword: instanceof) ist das der Fall zu einem Container casten und den Inhalt zählen.


    Zum Thema automatische Itemerkennung, das ist etwas knifflig entweder beim in die Kiste legen prüfst du das nur ein Typ Item drinne ist oder du lässt den Spieler per Hand schreiben/per Command welches Item verkauft/gekauft werden soll.


    Da du schon geschrieben hast es die Items erkennen soll hier wie es geht:


    Beim Container schließen prüfen ob nur ein Typ Item in der Kiste ist falls nicht, Inventar wieder öffnen oder optional einfach alle Items droppen. (Hier kannst du, wenn du gerne Algoryhtmen schreibst, nur die Itemtypen droppen die in der Minderheit sind)

    Dann bei Command/Schild platzieren einfach wieder auf den Block bzw den Container zugreifen und die Items "auslesen"

    Es wäre zum einen schonmal gut wenn wir wissen um welche Sprache es sich hier handeln soll, dementsprechend gibt es vielleicht wie z.B. Java oder PHP UUID in C' gibts Guid's etc

    Und dann die Frage speicherst du das in ner Datenbank? Wenn ja einfach ne Spalte uniqueUserId INT AUTO_INCREMENT PRIMARY KEY machen?

    2. Spieler in Creative Mode setzen, und InventoryOpen, BlockPlace, BlockBreak Events und so weiter selber handeln.

    Das Problem dabei is nur das er dann auich keinen Schaden bekommt oder Leben hat er müsste eigentlich einen komplett eigenen Gamemode entwickeln :D


    Die wohl einfachste Variante ist, wie Pierre schon sagte, ein Ressourcepack und das dann "Forcen"

    Allerdings kannst du natürlich auch versuchen Vehicle Packets zu senden. Wie das geht kann ich dir aber leider nicht sagen.

    Naja die ersten 7 Fehler sagen Type Missmatch!

    Der Rest sieht so aus als wären es Folgefehler der Type Missmatches!


    Ich rate einfach mal MCP neu zu laden.

    Versuch doch mal deine Hashmap anders zu befüllen. Soweit ich weiß hat das befüllen mithilfe einer anonymen klasse einige seiteneffekte und kann zu Fehlverhalten führen in gewissen Konstellationen.


    Also Map deklarieren, dann einzeln Elemente hinzufügen und dann map in das Jason packen.

    Das habe ich bereits ich hab versucht direkt den Datentyp Map / List zu setzten in die Map hat aber das selbe Ergebnis hervorgebracht.


    Admiral_Zott

    Ist zwar ganz nett so aber mein Ziel ist mit dieser Datei gewesen EINE Klasse zu haben die ich einfach importiere und fertig.

    Und das das mit den Properties nicht klappt erklärt sich einfach dadurch das eine .properties Datei schon von der Struktur her nicht in der Lage ist irgendeine Art von "Complex Datatype" anzuzeigen.



    OKAY WOW...


    ich hab mein "Fehler" gefunden oder sollte ich sagen das Hirngespinst von JAVA :(

    Also das Problem waren die Doppelten geschweiften Klammern anscheinend interpretiert Java die so als wäre kein Konstruktor vorhanden zumindest hat Gson dann das hier {} als Konstruktor beim auslesen. Naja wenn man sich seine Finger bricht und die 2 extra Zeilen schreibt erkennt Gson auch den Konstruktor und bekommt nicht null raus.


    UND JA ich weine innerlich :D

    Also für alle Schreibfaulen die das selbe Problem haben schreib die Deklarierung, Initialisierung und die Befüllung in einzelne Zeilen dann ist das Problem gelöst :D

    Ok im Anhang die Configuration Klasse :D

    Aber an setMap() liegt es sicher nicht. Ich setzte wortwörtlich nur die Value in der HashMap sonst nichts :(

    Zu Json und somit in die File gespeichert wird es erst in save().


    Ich werde mal versuchen das ganze so umzubauen anstatt den Objekten direkt nur die Json Strings zu speichern aber das ist dann wiederum mit ner Menge de/serializen verbunden für jedes einzelen Objekt das gepsiechert wird.