Eine Quest programmieren?

  • Hey Leute,


    ich wollte schon öfters eine Art Quest Plugin schreiben bin aber meistens am WIE der Quest Klasse gescheitert oder habe nach Stundenlangem Kopfzerbrechen aufgegeben.

    Nun mein Problem ist es die Quest Klasse richtig aufzuziehen, sodass ich sie individuell für die verschiedensten Quest Typen nutzen kann.


    Beispiel: Es gibt Quests zum Sammeln von Items, zum Abbauen von Blöcken oder einfach zum Töten eines gewissen Monsters!

    Nun stellt sich die Frage wie stelle ich das am Besten an :D


    Einige Felder die mehr kosmetisch sind, wären schon gegeben:

    Code
    1. private String client, description;
    2. private int repeats, reward;

    Nun habe ich mir überlegt es wäre eine Art Bedingungs Liste praktisch, welche Steps die Quest hat bzw. erfüllt werden müssen.

    Allerdings müsste man gleichzeitig z.B. die Menge der gesammelten Items oder getöteten Monster speichern können.


    Ich dachte da an sowas in der Art: :/

    Code
    1. private int currentStep = 0;
    2. private Hashtable<Object, Integer>[] questProgress;
    3. public int getProgress(Object condition) {
    4. return questProgress[currentStep].get(condition);
    5. }

    Das ist allerdings nicht gerade sehr elegant.


    Meine andere Lösung wäre folgendes:

    Ist auch nicht gerade das schönste aber es erfüllt den Zweck.

    Ich hätte gerne euere Meinung welche der oben genannten Methoden die "Elegantere" ist oder vielleicht habt ihr ja auch einen ganz anderen Ansatz

    Also wenn jemand ne andere Idee hat oder nen Vorschlag freue mich über beides :D

    If you are homeless ... just buy a house, duh!

    and if you wanna have a plugin matching your conditions ... just code it yourself!

    • Hilfreich

    Also ich habe mal kurz eben darüber nachgedacht.

    Ich würde das so angehen:

    Beispiel CollectQuest:



    Ich hoffe, man versteht auf was ich hinaus will :D


    Und wenn du mehrere Quest-Steps hast, kannst du natürlich anonyme Funktionen nehmen, deine Liste mit QuestSteps oder schlicht einen Enum.

    Persönlich wäre ich der einfachheitshalber für den einfachen Enum (vor allem bei einfachen Quests).

  • Die Idee mit den Events über die Quests zu regeln gefällt mir sehr. Werde ich vermutlich auch so einbauen

    Danke für den Tipp darauf wäre ich so schnell wohl nicht gekommen, echt hilfreich noch eine andere Sichtweise zu haben :D

    If you are homeless ... just buy a house, duh!

    and if you wanna have a plugin matching your conditions ... just code it yourself!

  • An sich ist bei solchen Sachen ein reinschauen bei anderen nie verkehrt. Und bei dem Thema quests in Minecraft fällt mir immer direkt ein Plugin ein, da es echt Millionen Möglichkeiten liefert und einfach riesig ist. Es gibt Dutzende Events, Dutzende conditions, man kam Spieler Tags zuweisen im Prinzip als Marker welchen man dann beim ansprechen von anderen npcs als trigger für unterschiedliche Conversation es nutzen kann.


    Kannst da ja mal reinschauen und dich ein wenig inspirieren lassen: https://github.com/Co0sh/BetonQuest/wiki

  • Hab mich mal etwas durch gelesen und sieht echt genial aus werde das mal austesten was man so damit machen kann. Leider ist es für meinen Zweck etwas "übermächtig" da ist so viel Zeug drinnen das ich überhaupt nicht brauche.

    Da das ganze sowieso in ein anderes Plugin integriert werden soll. Möchte ich das so simpel wie möglich halten. Ich muss zum Beispiel Sachen wie IfElse Conditionen oder GameMode Conditionen garnicht handhaben.


    Aber an sich nutzt er ja ein ähnliches Konzept wie ich oben schon als Idee hatte

    Code
    1. private static HashMap<ConditionID, Condition> conditions = new HashMap<>();

    Dann werde ich wohl das mit der vererbten Klasse machen. Ist sowieso die elegantere Methode :D
    Danke an alle die Ideen eingebracht haben


    :closed

    If you are homeless ... just buy a house, duh!

    and if you wanna have a plugin matching your conditions ... just code it yourself!

  • Auch wenn das Thema jetzt schon abgeschlossen ist habe ich noch einen kleinen Denkanstoß für dich: "Quests mit mehrerern Abschnitten".

    Einige Quests könnten auf anderen aufbauen. Das heißt du brauchst eine Art Relation. Ich würde das über eine parentId machen. Für die erste Quests wäre das dann die 0 und sonst halt die jeweilige Id.


    Um eine Vielzahl von Aufgaben zu bieten, kannst du ja eine art BaseQuest machen, welche grundlegende Features bietet, die alle Quests haben. von der lässt du dann erben und validierst die daraus enstehende Quest mit einer Factory.


    Sowas würde sich dann auch relativ einfach in einer Datenbank speichern lassen in dem du einen String abspeicherst, der das Questobjekt als Json beinhaltet.