• 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!

PVE System

Airscope

Minecrafter
Registriert
9 Juli 2018
Beiträge
2
Diamanten
300
Minecraft
Airscope
Hi Leute

Wir sind momentan in der Entwicklung für ein PVE System. Soll bedeuten, dass man für Monster töten sogenannte "Seelen" einsammelt und diese dann bei einem Villager gegen seltene bis gar nicht spawnende Items eintauschen kann.
Nun bin ich wirklich neu in dieser Szene. Bin der Serverowner und von Beruf her selbst Software Entwickler. Habe jedoch noch nicht wirklich mit der Minecraft Libary gearbeitet.
Könnt ihr aus Erfahrung sagen, was hier für Probleme auftreten können? Mögliche Performance Issues oder sogar Server Crasher?

Wäre sehr dankbar um gute Inputs.


Lg
Airscope
 
Zuletzt bearbeitet von einem Moderator:

JOO200

Braumeister
Registriert
18 Dezember 2016
Beiträge
442
Diamanten
228
Über die Spigot-Api solltest du deine Wünsche ohne große Probleme umsetzen können.

Seelen bekommen: Spigot arbeitet Eventgesteuert. Wenn du nun auf das EntityDeathEvent "hörst", kannst du performanceschonend abfragen, ob ein Spieler ein Entity getötet hat. Dabei kannst du dir auch den Typ des Mobs anschauen, um den es sich handelt.
Achte beim Benutzen des Events darauf, dass du genügend Nullprüfungen durchführst. So kann EntityDeathEvent$getKiller null zurückgeben, sollte der Mob einfach so gestorben sein.
Du kannst dem Inventar vom Killer relativ einfach ein Item hinzufügen, das Item sollte wohl am besten in einer Config gespeichert werden und evtl. per Befehl setzbar sein. Ein ItemStack lässt sich relativ simpel in eine Spigot-Config in Yaml-Format ablegen und laden.

Seelen umtauschen: Dafür gibt es zwei Möglichkeiten: Du spawnst über einen Command-Block deinen eigenen Villager und gibst ihm seine eigenen Handelsmöglichkeiten mit. Das müsstest du dir aber selbst anschauen, mit CommandBlocks mach ich so gut wie nie was.
Variante 2 wäre der Einsatz eines Zusatzplugins für Citizen2. Citizen ist ein Plugin zum Erstellen von NPCs und hat eine angenehme Api, da kann man über ein NPCClickEvent relativ rasch ein Trade-Inventar aufsetzen. Das entsprechende Verhalten eines solchen Händlers kann man über einen Trait dem NPC hinzufügen. Das schöne dabei ist, dass du somit nur einmal den Händler programmieren musst und danach einfach allen NPCs diesem Trait hinzufügen. Dann hat jeder NPC mit diesem Trait automatisch die Händlereigenschaft.

Ich denke, dass du zu jeder Idee per Google genug Informationen findest ;)

Performance und Crashsicherheit:
Spigot arbeitet wie erwähnt Eventgesteuert. Solange du nicht Events benutzt, die sehr häufig abgerufen werden (MoveEvent, TickEvent o.ä.), sollte es keine Performance Probleme geben.
Du solltest den Hauptthread, in dem alle Listener etc. abgearbeitet werden, nicht aufhalten. Also keine DB-Abfragen synchron laufen lassen oder ähnliches. Alles andere ist unproblematisch. NPE oder andere Exceptions werden herausgefiltert und in das Log geschrieben, der Server crasht dadurch nicht. (Schön sind sie trotzdem nicht)
 

Chrisliebär❤️

nur echt mit ❤️
Moderator
Registriert
19 Mai 2014
Beiträge
1.675
Diamanten
830
Du solltest den Hauptthread, in dem alle Listener etc. abgearbeitet werden, nicht aufhalten.
Vor allem ist die Bukkit API nicht threadsafe, sofern in der Dokumentation nicht explizit erwähnt wird, dass etwas threadsafe ist. Und ich glaub das sind sowieso nur Teile vom Chatsystem. Asynchroner Code muss wenn er mit der API interagieren will über den Scheduler mit dem Gameloop synchronisiert werden.
 

Airscope

Minecrafter
Registriert
9 Juli 2018
Beiträge
2
Diamanten
300
Minecraft
Airscope
Über die Spigot-Api solltest du deine Wünsche ohne große Probleme umsetzen können.

Seelen bekommen: Spigot arbeitet Eventgesteuert. Wenn du nun auf das EntityDeathEvent "hörst", kannst du performanceschonend abfragen, ob ein Spieler ein Entity getötet hat. Dabei kannst du dir auch den Typ des Mobs anschauen, um den es sich handelt.
Achte beim Benutzen des Events darauf, dass du genügend Nullprüfungen durchführst. So kann EntityDeathEvent$getKiller null zurückgeben, sollte der Mob einfach so gestorben sein.
Du kannst dem Inventar vom Killer relativ einfach ein Item hinzufügen, das Item sollte wohl am besten in einer Config gespeichert werden und evtl. per Befehl setzbar sein. Ein ItemStack lässt sich relativ simpel in eine Spigot-Config in Yaml-Format ablegen und laden.

Seelen umtauschen: Dafür gibt es zwei Möglichkeiten: Du spawnst über einen Command-Block deinen eigenen Villager und gibst ihm seine eigenen Handelsmöglichkeiten mit. Das müsstest du dir aber selbst anschauen, mit CommandBlocks mach ich so gut wie nie was.
Variante 2 wäre der Einsatz eines Zusatzplugins für Citizen2. Citizen ist ein Plugin zum Erstellen von NPCs und hat eine angenehme Api, da kann man über ein NPCClickEvent relativ rasch ein Trade-Inventar aufsetzen. Das entsprechende Verhalten eines solchen Händlers kann man über einen Trait dem NPC hinzufügen. Das schöne dabei ist, dass du somit nur einmal den Händler programmieren musst und danach einfach allen NPCs diesem Trait hinzufügen. Dann hat jeder NPC mit diesem Trait automatisch die Händlereigenschaft.

Ich denke, dass du zu jeder Idee per Google genug Informationen findest ;)

Performance und Crashsicherheit:
Spigot arbeitet wie erwähnt Eventgesteuert. Solange du nicht Events benutzt, die sehr häufig abgerufen werden (MoveEvent, TickEvent o.ä.), sollte es keine Performance Probleme geben.
Du solltest den Hauptthread, in dem alle Listener etc. abgearbeitet werden, nicht aufhalten. Also keine DB-Abfragen synchron laufen lassen oder ähnliches. Alles andere ist unproblematisch. NPE oder andere Exceptions werden herausgefiltert und in das Log geschrieben, der Server crasht dadurch nicht. (Schön sind sie trotzdem nicht)

Wow hätte nicht so schnell ein Feedback erwartet. Danke dir viel Mals. Bezüglich dem EntityDeathEvent werden somit noch Anpassungen notwendig sein. Der Trade mit einem Villager hat schon reibungslos funktioniert. Ich werde aber noch die Null Prüfungen erweitern. Sehr gute Tipps. Danke dir sehr.
 

UnityGaming

Workaholic
Registriert
25 Oktober 2015
Beiträge
527
Alter
26
Diamanten
312
Minecraft
FastFelix771
Ich werde aber noch die Null Prüfungen erweitern.
Grade bei der Arbeit mit Inventaren (z.B. InventoryClickEvent) solltest du sehr defensiv vorgehen. Dieses Event wird zum Beispiel auch erzeugt, wenn der Spieler *irgendwo* in ein Inventar klickt.
Auch bei ItemMeta und besonders dem Displayname innerhalb der ItemMeta lauern böse NPEs.
 
Oben