Quest Konfiguration

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • In diesem Guide wird Schritt für Schritt das Erstellen einer Quest, aus der Sicht eines Nicht-Entwicklers, erklärt.

    Vorbereitungen

    Zunächst musst du dir erst einmal ein Programm zum Erstellen der nötigen Dateien downloaden. Wir verwenden Notepad++
    Wenn du es Installiert hast müssen folgende Einstellungen geändert werden:
    1. in der oberen Menüleiste unter Kodierung UTF-8 ohne BOM auswählen
    2. in der oberen Menüleiste unter ''Ansicht'' -> ''Nicht druckbare zeichen'' das Häkchen bei ''Leerzeichen und Tabulatoren anzeigen'' setzen
    3. in der oberen Menüleiste auf ''Einstellungen'' -> ''Optionen'' -> ''Sprachmenü/Tabs'' im rechten unteren Bereich des Fensters die Tabulatorenbreite auf 2 setzen und ein Häkchen bei ''durch Leerzeichen ersetzen''' machen
    4. OPTIONAL: in der oberen Menüleiste kannst du unter ''Einstellungen'' -> ''Stile'' den Hintergrund ändern, auf Dauer wird das Weiß recht anstrengend für die Augen, ich nehme gerne ''Black Board',' aber das ist kein Muss
    Soweit zu Notepad++. Damit es für uns leichter ist dir zu helfen, falls du irgendwo Schwierigkeiten hast, kann ein Dropbox-Konto, zu dem du jemanden von uns einlädst, sehr hilfreich sein. Natürlich kannst du die Dateien auch per E-Mail verschicken, jedoch ist dies sehr viel umständlicher.


    Bestandteile

    Eine Quest besteht aus mehreren Bestandteilen, welche alle als YML abgespeichert werden müssen. Dies erreichst du in dem du in der oberen Menüleiste unter ''Datei'' -> ''Speichern unter'' -> unter dem Dateinamen ''YAML Ain't Markup Language'(*.yml) auswählst.
    ACHTUNG: Am Ende des Dateinamens musst du manuell ein .yml setzen.

    Die einzelnen Bestandteile sind:
    • der Host (der NPC mit dem der Spieler interagiert)
    • die Conversation (das Gespräch zwischen NPC und Spieler)
    • die default.conv (eine Text den der NPC ausgibt, wenn die Quest nicht aktiv ist)
    • die Mobs/Mobgroups (für die Quest nötige Monster/Monstergruppen)
    • die Quest Startdatei (dort wird festgelegt was, wann, wo passiert)
    • die Readme (einige Infos damit andere Programmierer sich schneller in die Quest einfinden)
    Diese werden in einem Ordner mit ggf. mehreren Unterordnern abgelegt und der Übersicht halber etwas vorsortiert.

    Hosts

    Der sogenannte Host ist der oder die NPC's mit denen der Spieler interagiert und für die die Conversations geladen werden.
    In der Hostdatei werden die einzelnen Parameter für diesen angegeben, hier eine Beispiel Konfiguration:

    Quellcode

    1. name: Stallbursche
    2. # der Name des Npc, nicht länger als 16 Zeichen
    3. type: NPC
    4. health: 100
    5. # 100 ist im Regelfall vollkommen ausreichend
    6. attackable: false
    7. # wenn auf true ist er angreifbar
    8. friendly: true
    9. # wenn auf false greift er den Spieler an
    10. default-conv: this.stallbursche.default
    11. # die hier angegebene conv. wird dann gesetzt wenn die Quest noch nicht gestartet ist
    12. equipment:
    13. hand: HAY_BLOCK
    14. leggings: LEATHER_LEGGINGS
    15. boots: LEATHER_BOOTS
    16. # die Ausrüstung des NPCs, bitte immer in dem Format angeben
    17. # custom-Köpfe sind auch möglich, verursachen aber im Moment eher noch Schwierigkeiten
    18. # möglich wäre auch noch
    19. # chestplate: LEATHER_CHESTPLATE
    20. location:
    21. world: world
    22. x: -1711
    23. y: 71
    24. z: -48
    25. # wo der NPC stehen soll und auf welcher Welt
    26. # für Azuran wäre es world, für den Freebuild freebuild, usw.
    Alles anzeigen


    Wichtig: Damit das Questplugin die Datei auch als Host anerkennt musst du beim Abspeichern folgende Endung verwenden:
    • karluwefritz.host.yml
    Wichtig: Der Name des Host's darf nicht länger als 16 Zeichen sein.

    Wichtig: Es ist immer besser bei den Items diese auszuschreiben, hier eine Liste

    Conversations

    Die Conversation ist die Unterhaltung zwischen NPC und dem Spieler. In ihr werden die Einzelheiten der Quest/die Story vermittelt, je nach ausgewählter Antwort des Spielers kann diese unterschiedlich ausfallen.
    Dieses 'Gespräch' läuft nach dem Frage-Antwort Prinzip ab, heißt der NPC macht eine Aussage/stellt eine Frage -> der Spieler wählt eine Antwort aus,.... und immer so weiter.
    Ein solcher Abschnitt wird Stage genannt, diese Stages müssen nicht zwangsweise Stage1, Stage2, Stage3,... heißen. Die Namen sind unwichtig, es macht aber durchaus Sinn außer für bestimmte Stages eine Durchnummerierung zu wählen. Die erste Stage heißt immer Start, die Stage in der die Quest vom Spieler angenommen wird accept und die in der die Quest beendet wird finished.

    Der Aufbau einer solchen Conversation wird im folgenden an einem Beispiel erklärt:

    Quellcode

    1. stages:
    2. start:
    3. #der Name der stage
    4. text: Hallo du!|Würdest du mir vielleicht helfen?
    5. # was der NPC sagen soll
    6. answers:
    7. '1':
    8. text: Klar doch. Was soll ich tun?
    9. actions:
    10. A:
    11. type: STAGE
    12. args:
    13. stage: stage2
    14. #der action STAGE sorgt dafür das das Gespräch in der angegebenen Stage weiter geführt wird
    15. '2':
    16. text: Nein, ich habe keine Zeit.
    17. actions:
    18. A:
    19. type: END
    20. #die Action END beendet das Gespräch, es kann aber wieder von vorne begonnen werden
    21. #die Antwortmöglichkeiten des Spielers mit deren Auswirkungen
    22. stage2:
    23. text: Ich habe hier eine Lieferung mit Heu|für den Pferdeknecht in Bravaria.|Könntest du sie zu ihm bringen?
    24. answers:
    25. '1':
    26. text: Klar mach ich, gib her.
    27. actions:
    28. A:
    29. type: STAGE
    30. args:
    31. stage: stage4
    32. '2':
    33. text: Warum bringst du sie ihm nicht selbst?
    34. actions:
    35. A:
    36. type: STAGE
    37. args:
    38. stage: stage3
    39. stage3:
    40. text: Weil ich hier alleine bin| und das Lager bewachen muss.
    41. answers:
    42. '1':
    43. text: Ach so. Okay ich bring es rüber.
    44. actions:
    45. A:
    46. type: STAGE
    47. args:
    48. stage: stage4
    49. '2':
    50. text: Tja dein Pech, ich hab keine Zeit für sowas.
    51. actions:
    52. A:
    53. type: END
    54. stage4:
    55. text: Oh danke!| Hier hast du es.
    56. answers:
    57. '1':
    58. text: Aber wie komme ich dahin?
    59. actions:
    60. A:
    61. type: STAGE
    62. args:
    63. stage: accept
    64. accept:
    65. text: Folge dort drüben der Strasse, die nach Bravaria führt.||Folge dann dem Weg weiter bis er nach rechts abbiegt und|laufe danach links durch die Tore.||Dann läufst du genau am Stall vorbei.
    66. #diese stage heißt accept weil die Quest für den Spieler startet sobld er in dieser Gesprächsebene ankommt
    Alles anzeigen



    Wichtig: Damit das Questplugin die Datei auch als Conversation anerkennt musst du beim Abspeichern folgende Endung verwenden:
    • beispiel-conversation.conv.yml
    Wichtig: Der gesamte Text des NPC's muss in einer Zeile stehen, Zeilenumbrüche werden mit einem | angegeben. Zwei | bewirkt einen Absatz.


    Wichtig: Es gibt jeweils eine Conversation für den Start der Quest, das Ende der Quest, bevor die Quest annehmbar ist und wenn eine Quest abgeschlossen ist. Ggf. kann eine Conversation dazwischen geschaltet werden, um dem Spieler weitere Hinweise zu geben.
    Logischer weise hat jeder NPC seine eigene conv.


    Mobs/Mobgroups

    Solltest du in der Quest bestimmte Monster spawnen wollen, benötigt das Plugin einen Mobdatei. Am besten in einem Unterordner mit dem Namen ''Mobs''.
    Selbstverständlich können auch Mobgruppen verwendet werden.
    Diese beiden kurzen Beispiele erklären wie man solche Mobs und Mobgruppen erstellt. Eine ausführlichere Erklärung fndest du hier: RcMobs

    Wichtig: Damit das Questplugin die Datei auch als Mob anerkennt musst du beim Abspeichern folgende Endung verwenden:
    • beispiel-mob.mob.yml
    Wichtig: Damit das Questplugin die Datei auch als Mobgruppe anerkennt musst du beim Abspeichern folgende Endung verwenden:
    • beispiel-mob-gruppe.group.yml


    Quellcode

    1. max-health: 88
    2. #min. und max. Gesundheit
    3. min-damage: 3
    4. max-damage: 5
    5. #min. und max. Schaden de der Mob austeilt
    6. loot-tables:
    7. - trash
    8. - equipment
    9. #die Tabellen aus dehnen der Loot den das Mob falle läst random gewählt wird
    10. equipment:
    11. chest: leather_chestplate
    12. legs: leather_leggings
    13. boots: leather_boots
    14. head: skull:PFC_BowlingBall
    15. hand: 268
    16. #die Ausrüstung des Mobs, wie beim Host auch
    17. baby: false
    18. #wenn auf true werden auch die baby varianten gespawnt
    19. reset-health: true
    20. #wenn auf true wird beim abbrechen des Kapmfes die Gesundheit des Mobs wieder hergestellt
    21. ranged: false
    22. #wenn auf true gesetzt brauch das Mob als Item einen Bogen um fernkampfangriffe ausführen zu können
    23. elite: false
    24. #markiert den Mob als besonders, niehmals random spawnen lassen und wirklich ein besonderen Mob daraus machen (stark, zäh,..
    25. water: false
    26. #wenn auch true gesetzt spanen die Mobs auch im Wasser, eig. nicht zu empfehlen da diese so eh ertrinken
    27. sound:
    28. hurt: random.classic_hurt
    29. hurt-pitch: 1.0
    30. death: random.classic_hurt
    31. death-pitch: 0.25
    32. #die Geräusche die das Mob macht wenn es stirbt oder verletzt wird
    Alles anzeigen

    Quellcode

    1. min-amount: 3
    2. max-amount: 5
    3. #die minimale und maximale Anzahl an mobs die gespawnt weren soll
    4. mobs:
    5. bravaria-banditen-lvl1-3-draufgaengerischer-bandit:
    6. chance: 0.2
    7. bravaria-banditen-lvl1-3-schwacher-bandit:
    8. chance: 0.5
    9. bravaria-banditen-lvl1-3-bandit-bogenschuetze:
    10. chance: 0.15
    11. bravaria-banditen-lvl1-3-patron-der-banditen:
    12. chance: 0.15
    13. #die Mobs aus der die Gruppe besteht und deren chance zu spawnen in % wobei alle zusammen immer 100% ergeben müssen
    14. #die - trennen die Ordenr in dehnen sich die 'original' Mobdatein befinden
    15. interval: 300.0
    16. #der Zeitraum nach dem neue obs spawnen
    17. spawn-radius: 30
    18. #der Radius in dem die Mobs spawnen
    19. respawn-treshhold: 2
    20. #am Beispiel hier: sind noch 2 Mobs der Gruppe vorhanden werden keine neuen gespwnt
    21. min-interval: 300
    22. max-interval: 300
    23. #der respawn Wert wird ebenfals random gewählt
    Alles anzeigen

    Trigger, Actions und Requirements

    Um aus diesen Teilen nun eine Quest zu bauen benötigst du die trigger, actions und requrimennts der Action API.
    Eine vollständige Liste findest du hier ganz unten: Action API

    Trigger

    Der Trigger ist der Auslöser für eine Action oder ein requirement check. Ohne ihn geht nichts. Trigger können z.B. das Interagieren des Spielers mit einem NPC oder Item sein, das durchqueren eines bestimmten Gebietes usw.

    Actions

    Die Action wird durch einen Trigger ausgelöst. Actions können z.B. das Spawnen von Mobs, das Starten eines neuen Gespräches und das Teleportieren des Spielers sein.

    Requirements

    Das requirement ist eine Voraussetzung die erfüllt werden muss um eine folgende Action zu ''genehmigen''.
    Der Check ob dieses Requirement erfüllt wurde, wird über einen Trigger ausgelöst.

    Die quest.start

    Nun kommen wir zum Herzstück der Quest.
    In dieser Datei wir der gesamte Questablauf festgelegt, also ab wann die Quest startet, wann welche Conversation geladen wird, die Belohnung, ...
    Dazu benötigst du die oben angesprochenen Trigger, Actions und Requirements.
    Grob gesehen besteht die quest.start aus 3 Elementen. Der Start wo festgelegt wird wann die Quest startet, die Objektives wo festgelegt wird was der Spieler tun muss und der Schluss wo festgelegt wird was er als Belohnung bekommt und was anschließend geschieht.
    An dieser kurzen Beispielquest wird dies veranschaulicht.
    Je nach Art der Quest werden unterschiedliche trigger, action und requirements verwendet.
    Wichtig ist darauf zu achten, dass die quest-complete.conv erst dann geladen wird, wenn der Spieler das zugehörige Objective erledigt hat damit es dem Spieler nicht möglich ist zu schummeln.

    Quellcode

    1. name: Heu Lieferung
    2. #Name der Quest
    3. desc: Eine Lieferung für den Pferdeknecht
    4. #eine kurze Beschreibung, nicht zu lang
    5. locked: false
    6. #wenn auf true kann die quest nicht von 'normalen' Spielern gestartet werden
    7. author: Kiachan
    8. #wer die Quest erstellt hat
    9. ordered: false
    10. #wenn auf true müssen die Objectives der Reihe nach erledigt werden
    11. hidden: true
    12. #wenn auf true wird nur das erste objective im Questbuch angezeigt, geht nur wenn ordered auf ture steht
    13. required: 0
    14. #es gibt die Möglichkeit eine vorraussetzung einzubauen, z.B. eine Lvel Begrenzung
    15. worlds:
    16. - world
    17. #auf welcher Welt die Quest spielt
    18. trigger:
    19. '0':
    20. type: host.interact
    21. args:
    22. host: this.stallbursche
    23. actions:
    24. '0':
    25. type: rcconversations.conversation.start
    26. args:
    27. host: this.stallbursche
    28. conv: this.start-quest
    29. #dieser erste Abschnitt sorgt dafür das wenn der Spieler mit dem angegebenen Host interagiert, ihn anklickt, die in der darunter stehenden action angegebene conversation gestartet wird
    30. #eine conversation kann aber auch über andere trigger gestartet werden, meist bietet sich dieser aber an
    31. '1':
    32. type: rcconversations.conversation.stage
    33. args:
    34. conv: this.start-quest
    35. stage: accept
    36. actions:
    37. '0':
    38. type: quest.start
    39. args:
    40. quest: world.bravaria.kia.heu_lieferung.start
    41. '2':
    42. type: rcconversations.host.save
    43. args:
    44. host: this.stallbursche
    45. conv: this.end-quest
    46. '3':
    47. type: rcconversations.host.save
    48. args:
    49. host: this.1-heu-lieferung.pferdeknecht
    50. conv: this.1-heu-lieferung.complete-quest
    51. '4':
    52. type: quest.item.add
    53. args:
    54. item: Heu Lieferung
    55. #entweder der Name des Items oder die ID also z.B rci90908 wichtig bei custom items ist das 'rci' am Anfang
    56. amount: 64
    57. #nun werden dadurch das der Spieler eine bestimmte Ebene/Stage der conversation erreicht hat mehrere actions ausgeführt: die Quest als solche gestartet, die folgenden conversations für die jeweiligen Host's geladen und dem Spieler das benötigte Item gegeben
    58. #wichtig hier ist die richtige Benennung der Stage, hier besteht die Möglichkiet mehrere verschiedene trigger einzubauen, mit unterschiedlichen actions
    59. #das war der erste Teil, hauptsächlich wird hier der Start der Quest herbei geführt
    60. '2':
    61. type: host.interact
    62. args:
    63. host: this.1-heu-lieferung.pferdeknecht
    64. actions:
    65. '0':
    66. type: rcconversations.conversation.start
    67. args:
    68. host: this.1-heu-lieferung.pferdeknecht
    69. conv: this.1-heu-lieferung.complete-quest
    70. requirements:
    71. '0':
    72. type: quest.item.has
    73. args:
    74. item: 90908
    75. amount: 64
    76. #damit der Spieler die Quest auch abschließen kann muss die complete-quest.conv für den jew. host geladen werden, was hier geschieht
    77. #wichtig hierbei ist ein passendes requirement zu finden um cheating zu verhinder, in diesem Falle wird die complete-quest.conv nur geladen wenn der Spieler das genante Item im Inventar hat
    78. objectives:
    79. #hier wird definiert was der Spieler erledingen soll
    80. '0':
    81. name: Bringe das Heu zum Pferdeknecht
    82. #dieser Text wird im Questbuch angezeigt
    83. trigger:
    84. '0':
    85. type: rcconversations.conversation.stage
    86. args:
    87. conv: this.1-heu-lieferung.complete-quest
    88. stage: finished
    89. #hier wird nun festgelegt das die Quest erst als erfüllt gilt wenn der Spieler die vorgegebenen Stage erreicht hatt
    90. #bei großen Questst ist es besser mehrere kleine Objectives anzulegen, die vom Spieler abgearbeitet werden
    91. complete-actions:
    92. '0':
    93. type: rcskills.hero.addxp
    94. args:
    95. exp: 250
    96. #gibt dem Spieler 250 Erfahrungspunkte
    97. '1':
    98. type: player.give.money
    99. args:
    100. amount: 1s50k
    101. #gibt dem Spieler 1 Silber und 50 Kupfer (xg,xs,xk wäre die Reihenfolge)
    102. '2':
    103. type: rcconversations.host.save
    104. args:
    105. host: this.1-heu-lieferung.pferdeknecht
    106. conv: this.1-heu-lieferung.end-quest
    107. #hier wird für den letzten Host die end-conv. geladen um zu cheating zu verhindern
    108. '3':
    109. type: quest.item.remove
    110. args:
    111. item: 90908
    112. amount: 64
    113. #und natürlich das Item zum erfüllen der Quest aus dem Inventar entfernt
    114. #weitere Möglichkeiten sind z.B. dem Spieler Items zu geben, ihn irgendwo hin zu teleportieren usw.
    Alles anzeigen


    Wichtig: Damit das Questplugin die Datei auch als Startdatei anerkennt musst du beim Abspeichern folgende Endung verwenden:
    • beispiel-quest-start.quest.yml


    Multiple Enden

    Wenn du möchtest das der Spieler die Quest auf verschiedene Art und Weisen beenden kann, ist das ebenfalls möglich.
    Dazu definierst du mehrer Objectives, welche die unterschiedlichen Enden darstellen und setzt alle bis auf eine als optional.
    Wichtig ist hierbei die Action : quest.complete am Ende auszuführen, damit die Quest auch wirklich als beendet markiert wird.
    Hier gibt es keine einheitlichen Complete-Quest actions, diese werden für jedes Ende individuell definiert.
    Hier ein Beispiel:

    Quellcode

    1. objectives:
    2. '0':
    3. name:Hole für Kana 64x Tintensäcke.
    4. trigger:
    5. '0':
    6. type: rcitems.item.pickup
    7. args:
    8. type: QUEST
    9. id: 91004
    10. actions:
    11. '0':
    12. type: rcconversations.host.save
    13. args:
    14. host: this.kana
    15. conv: this.complete-quest
    16. requirements:
    17. '0':
    18. type: dummy
    19. count: 63
    20. persistant: true
    21. count-text: '%current%/%count% Tintensäcke gesammelt.'
    22. '1':
    23. name:Gib Kana 64x Tintensäcke
    24. hidden: true
    25. trigger:
    26. '0':
    27. type: rcitems.item.pickup
    28. args:
    29. type: QUEST
    30. id: 91004
    31. actions:
    32. '0':
    33. type: quest.item.remove
    34. args:
    35. item: 91004
    36. amount: 64
    37. '1':
    38. type: rcskills.hero.addxp
    39. args:
    40. exp: 200
    41. '2':
    42. type: rcconversations.host.save
    43. args:
    44. host: this.kana
    45. conv: this.end-quest
    46. '3':
    47. type: quest.complete
    48. args:
    49. quest: this.start-tinte
    50. requirements:
    51. '0':
    52. type: dummy
    53. count: 63
    54. persistant: true
    55. count-text: '%current%/%count% Tintensäcke gesammelt.'
    56. '1':
    57. type: rcconversations.conversation.stage
    58. args:
    59. conv: this.complete-quest
    60. stage: end
    61. '2':
    62. name:Crafte 30 Bücher und gib sie Kana zusätzich
    63. hidden: true
    64. optional: true
    65. trigger:
    66. '0':
    67. type: player.craft
    68. args:
    69. item: 340
    70. actions:
    71. '0':
    72. type: player.give.money
    73. args:
    74. amount: 20s
    75. '1':
    76. type: rcskills.hero.addxp
    77. args:
    78. exp: 300
    79. '2':
    80. type: rcconversations.host.save
    81. args:
    82. host: this.kana
    83. conv: this.end-quest
    84. '3':
    85. type: player.remove.item
    86. args:
    87. item: 340
    88. amount: 30
    89. '4':
    90. type: quest.item.remove
    91. args:
    92. item: Rc91004
    93. amount: 64
    94. '5':
    95. type: quest.complete
    96. args:
    97. quest: this.start-tinte
    98. requirements:
    99. '0':
    100. type: player.has-item
    101. args:
    102. item: 340
    103. amount: 30
    104. '1':
    105. type: quest.item.has
    106. args:
    107. item: Rc91004
    108. amount: 64
    109. '2':
    110. type: rcconversations.conversation.stage
    111. args:
    112. conv: this.complete-quest
    113. stage: end1
    Alles anzeigen



    Die README.md

    In ihr werden alle wichtigen Infos abgespeichert, um auch für außenstehende schnell zu verstehen, worum es in der Quest geht.
    Es sollten folgende Infos enthalten sein:
    1. Forenlink (falls vorhanden)
    2. Kurzbeschreibung
    3. Ablauf
    4. Belohnung
    5. Benötigte Items/Mobs
    6. Sonstige Anmerkungen


    Sonstige Anmerkungen/Tipps

    • Möchtet ihr in Notepad++ eine Zeile auskommentieren (dann wird sie vom Plugin ignoriert) verwendet ihr # am Zeilenanfang
    • Umlaute wie ä, ü und ö und auch das ß in den Ordner- Dateinamen vermeiden.
    • Um zu sehen wann ein Zeilenumbruch nötig ist, nach 64 (einem Stack) Zeichen', markiert ihr mit der Maus den Textteil und schaut dann in der unteren Spalte bei der Abkürzung Sel: (Selektion)
    • Immer auf die Einrückungen achten (1 Tab bzw. 2 Leerzeichen) sonst funktioniert die gesamte Quest nicht! (YAML Parser benutzen yamllint.com/)
    • Immer darauf achten den richtigen Pfad anzugeben, sonst funktioniert die gesamte Quest nicht!
    • Anstatt den gesamten Pfad anzugeben kannst du auch this.host usw.. nutzen, dann bezieht sich das Plugin immer auf den Ordner in dem du dich gerade mit der Datei befindest. Wenn du allerdings eine Datei aus einem Unterordner benennen möchtest muss dieser genannt werden als z.B. this.unterordner1.host
    • Questitems werden nicht im normalen Inventar gelagert, sondern in einem speziellen Questinventar (die Items können vom Spieler nicht herausgenommen werden) /qi
    • zu jeder Quest erhält der Spieler ein Questbuch in sein Questlog in dem er seinen persönlichen Questfortschritt verfolgen kann


    Vollständiger Questordner

    So sieht die vollständige Quest dann aus:

    dropbox.com/sh/dowzboeq59g8rzx…t2DZpZZJ4pU-HzCOBOba?dl=0


    27.686 mal gelesen