Zeige Ergebnis 1 bis 11 von 11
  1. #1
    Benutzerbild von Kricz
    Registriert seit
    Apr 2008
    BNet Account
    Kricz
    Beiträge
    1.942

    Quest System v1.0

    Moin,


    viele kennen sicherlich das Problem mit Quests...
    Es ist nicht besonders einfach diese zu coden und oft ziemlich zeitaufwändig...

    Das find ich auch (auch wenn ich selbst nie das Problem hatte^^) und hab mein altes Quest System, dass ich mal in einer meiner Maps hatte, wieder geschrieben.
    Dies ist jedoch ein wenig anders geworden, als ich es mir gedacht hatte, und liefert noch mehr Features als mein altes. Das System selbst besteht derzeit aus:

    • Quest System Library
    • Quest Object Library
    • 2 Quest Object Templates (Kill and Gather Objects)

      Zusätzlich sind noch optionale Module enthalten:
    • Quest Event Library
    • 1 Quest Event Template (ItemQuestGiver)
    • QuestReward Library
    • QuestRewardDisplay Library



    Und was bieten die ganzen Module und Libraries??

    Features:
    • Automatische Quest Object Überprüfung
    • Automatische Messages bei neuen Quests, vollendeten Quests, Quest-Update usw
    • Eigene Quest-Rewards (wenn QuestReward Library ist enthalten)
    • Quest Reward Anzeigen (wenn QuestReward und QuestRewardDisplay Libraries enthalten)
    • Quest-Geber (wenn QuestEvents enthalten)
    • Eigene Quest Objects (sehr einfach selbst machbar, näheres dazu siehe unten)
    • Eigene QuestEvents (das Selbe wie bei Quest Objects]
    • Multiplayer tauglich (basierend auf dem QuestEvent)




    Doch was machen die ganzen Libraries eigentlich?
    Am besten lernt man ja bekanntlich durch kleine Beispiele. Ich habe in der Testmap 2 Quests erzeugt, welche alle Features des Systemes benutzen.

    Eine QUest ist eine typische "Kill-Quest", heißt man soll ne bestimmte Anzahl an Mobs töten, bei mir waren es 2x verschiedene Mur'gul Typen.
    Der Code der Quest sieht so aus:

    Mur'gul Hunt


    scope MurgulHunt initializer onInit

    globals
    private Quest MurgulHunt = 0
    private QuestEvent MurgulHuntEvent = 0
    endglobals

    private function onRewarded takes unit u, Quest q returns nothing
    call AddHeroXP(u, 200, true)
    endfunction

    private function onInit takes nothing returns nothing
    local QuestObject qObject = 0
    local QuestReward qRewards = 0
    local CustomReward qCustomReward = 0

    //So erzeugt man eine neue Quest
    set MurgulHunt = Quest.create("The Mur'gul Hunt", "ReplaceableTextures\\CommandButtons\\BTNMurgulBloodGill.blp")
    set MurgulHunt.questDescription = "Those fuckin Mur'gul are everywhere! Kill some of them and come back to me if you are finished"
    set MurgulHunt.isQuestRequired = true

    //Als erstes wollen wir, dass 9 Mur'gul Cliffrunner getötet werden müssen
    set qObject = KillQuestObject.create('nmcf', 9, "Kill 9 Mur'gul Cliffrunner")
    call MurgulHunt.addQuestObject(qObject)

    //Und als zweites 5 Mur'gul Blood-Gills
    set qObject = KillQuestObject.create('nmbg', 5, "Kill 5 Mur'gul Blood-Gills")
    call MurgulHunt.addQuestObject(qObject)

    //Als Belohnung soll es 250 Gold und 150 Holz für den Spieler geben
    set qRewards = QuestReward.create(250, 150)

    //Und zusätzlich noch 200 Erfahrung für den Held, der die Quest beendet, siehe oben
    set qCustomReward = CustomReward.create(onRewarded)
    set qCustomReward.description = "|cffffff00200|r Exp."
    call qRewards.addCustomReward(qCustomReward)

    //Jetzt fügen wir die QuestRewards nurnoch zur Quest hinzu und sind damit fertig
    set MurgulHunt.questReward = qRewards

    //Nun können wir ein QuestEvent erzeugen, ich benutze den ItemQuestGiver, der arbeitet mit Dummy-Items
    //welche "gekauft" werden müssen um Quests an- und abzugeben
    set MurgulHuntEvent = ItemQuestGiver.create(gg_unit_hfoo_0042, 'QA01', 'QC01')

    //Jetzt müssen wir das Event nurnoch zur Quest hinzufügen
    call MurgulHunt.addQuestEvent(MurgulHuntEvent)

    //Nun aktivieren wir den Quest-Geber und den Rest macht das System von alleine
    call MurgulHuntEvent.enable()
    endfunction

    endscope




    Mehr braucht man nicht, um eine Quest zu Erzeugen. Der einzige Aufwand ist, das QuestObject-Struct zu erzeugen und das QuestEvent-Struct. Diese Structs müssen ein anderes Struct extenden. Dieses Struct benötigt je nachdem bestimmte Methoden, welche vom QuestSystem aufgerufen werden um den Status der Quest zu bekommen oder ähnliches.
    Die QuestObject Library sieht so aus:

    QuestObject


    library QuestObjects requires optional QuestRewards

    private interface QuestObjectInterface

    Quest from = 0

    //This method has to be inside your Quest Object struct, telling the system, when your Quest Object is completed
    method isFinished takes nothing returns boolean defaults false

    //This method is called, when your Quest Object gets activated, meaning, when the Quest itself gets activated.
    //This method is optional!
    method onActivation takes nothing returns nothing defaults nothing

    //This method is used to get the current state of the quest inside of an quest update.
    //This method is only required, if DISPLAY_UPDATE_INFO is set to true
    method getUpdateState takes nothing returns string defaults ""

    //This method updates the description inside the quest log. It's mainly the same like the getUpdateState
    //but only used for updating it. The boolean includeState is true, if the Quest Object isn't completed and false
    //if it is not completed.
    method updateQuestDescription takes boolean includeState returns nothing defaults nothing

    endinterface


    struct QuestObject extends QuestObjectInterface

    readonly questitem object = null

    readonly boolean completed = false

    private string disc = ""

    private Quest from = 0



    //Use this method to change the description of your Quest Object and call
    //the method updateQuestDescription right after it. Please note, that
    //You have to set the description of your Quest Object by yourself, when
    //you are using a custom updateQuestDescription method
    method operator description= takes string s returns nothing
    set disc = s
    endmethod

    //This method returns the given description of the quest
    method operator description takes nothing returns string
    return disc
    endmethod

    //This method has to be declared inside of your Quest Object so that the
    //Quest System can check if the Quest Object is completed or not
    //If there is no method, you'll get an error
    stub method isFinished takes nothing returns boolean
    debug call BJDebugMsg("Please declare a <isFinished> method for your Custom Quest Object!")
    return false
    endmethod

    //Call this method inside of your Quest Object, when it should be marked as completed
    //If you want to mark the quest to the same state as it has currently, you'll get an error in debug mode
    method markAsCompleted takes boolean flag returns boolean
    if completed != flag then
    call QuestItemSetCompleted(object, flag)
    return true
    endif
    static if DEBUG_MODE then
    if completed and flag then
    debug call BJDebugMsg("Tried to mark an already completed quest object as completed!")
    else
    debug call BJDebugMsg("Tried to mark a not completed quest object as not completed!")
    endif
    endif
    return true

    endmethod

    //This method is called right after the Quest Object has been created. You can use it inside your
    //Quest Object to register events or other things, whatever you want
    stub method onActivation takes nothing returns nothing
    endmethod

    //You can declare your own updateQuestDescription method, if you want to add something behind the quest description
    //If you do so, please note, that you ahve to put the description by yourself inside the Quest Object, thus this method
    //below wont get called anymore
    stub method updateQuestDescription takes boolean includeState returns nothing
    debug call BJDebugMsg("You may want to declare <updateQuestDescription> method for your Custom Quest Object?")
    call QuestItemSetDescription(object, description)
    endmethod

    stub method getQuestState takes nothing returns string
    debug call BJDebugMsg("Seems like you want to display update infos but not using your own <getUpdateState> method.")
    return ""
    endmethod


    //Please don't call this function from outside of the struct!
    //It will be called by the Quest System itself, creating the required questitem with description and so on
    method createQuestObject takes Quest q returns nothing
    set object = QuestCreateItem(q.q)
    set from = q
    call QuestItemSetCompleted(object, false)
    call updateQuestDescription(true)
    call onActivation()
    endmethod

    endstruct



    endlibrary




    Wenn man das QuestObject-Struct als sein QuestObject für eine Quest benutzen würde, würde man nur Fehler-Meldungen bekommen. Um dies zu umgehen braucht man ein QuestObject-Struct. Passend zur Quest oben sieht der KillQuestObject-Struct demnach so aus:

    KillQuestObject


    library KillQuestObject requires QuestObjects

    globals
    private constant string STATE_OPENING = "("
    private constant string STATE_SLASH = "/"
    private constant string STATE_CLOSING = ")"
    endglobals


    struct KillQuestObject extends QuestObject

    private integer req = -1
    private integer cur = 0
    private integer unitType

    implement List

    private static trigger onDeathTrigger = null

    method isFinished takes nothing returns boolean
    return cur >= req
    endmethod

    method getCurrentState takes nothing returns integer
    return cur
    endmethod

    method getUpdateState takes nothing returns string
    return STATE_OPENING + " " + I2S(cur) + STATE_SLASH + " " + I2S(req) + " " + STATE_CLOSING
    endmethod

    method updateQuestDescription takes boolean includeState returns nothing
    if includeState then
    call QuestItemSetDescription(object, description + " " + getUpdateState())
    else
    call QuestItemSetDescription(object, description)
    endif
    endmethod

    method updateQuestState takes nothing returns nothing
    if isFinished() then
    call from.displayQuestMessage(this)
    call updateQuestDescription(false)

    call markAsCompleted(true)
    call from.checkRequirements()

    call listRemove()
    if count <= 0 then
    call DisableTrigger(onDeathTrigger)
    endif
    else
    call from.displayQuestMessage(this)
    call updateQuestDescription(true)
    endif
    endmethod

    method onActivation takes nothing returns nothing
    call listAdd()
    if count == 1 then
    call EnableTrigger(onDeathTrigger)
    endif
    endmethod

    static method create takes integer unitId, integer requiredKills, string objectDescription returns thistype
    local thistype this = allocate()
    set unitType = unitId
    set req = requiredKills
    set description = objectDescription
    return this
    endmethod

    private static method onDeath takes nothing returns boolean
    local unit u = GetTriggerUnit()
    local thistype this = first
    loop
    exitwhen this == 0
    if GetUnitTypeId(u) == unitType then
    set cur = cur + 1
    call updateQuestState()
    endif
    set this = next
    endloop
    set u = null
    return false
    endmethod


    private static method onInit takes nothing returns nothing
    set onDeathTrigger = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(onDeathTrigger, EVENT_PLAYER_UNIT_DEATH)
    call TriggerAddCondition(onDeathTrigger, Condition(function thistype.onDeath))
    call DisableTrigger(onDeathTrigger)
    endmethod


    endstruct

    endlibrary



    Wie ihr sehen könnt, hat das Struct selbst die Trigger, welche Kills registrieren und alles abchecken. In dem Struct kann man alles mögliche machen, wichtig für das Quest System sind eben nur die Methoden, welche auch in dem Interface enthalten sind.

    Bei den QuestEvents sieht dies im Prinzip genauso aus, nur dass diese ein wenig schwerer sind zu coden als die QuestObjects. Ich werde jedoch auch noch welche hinzufügen, derzeit sind geplant:

    ItemUseQuestEvent = Aktiviert eine Quest, wenn ein bestimmtes Item benutzt wird.
    UnitComesInRangeQuestGiver = Aktiviert / Vollendet eine Quest, wenn ein Held in die Nähe des Questgebers kommt, im Prinzip das Selbe wie der ItemQuestGiver in der Map, nur dass dieser keine Items benutzt.



    Was derzeit noch fehlt:
    • Quest-Failed method für QuestEvents
    • reset methoden für Quest und QuestObjects
    • was mir / euch noch einfällt


    Bitte testet das System wenn ihr Zeit habt und gebt mir Rückmeldung, was noch fehlt oder besser gemacht werden könnte.


    Ach so, terrorisiert nicht meine Terrain Skills, ich weiß, dass das Terrain episch ist!

    Kricz
    Dota 2
    >> Besucht uns im neuen ingame Portal inDota2! <<

  2. #2
    Benutzerbild von Robbepop
    Registriert seit
    Jun 2007
    Ort
    Am Arsch der Welt
    BNet Account
    Robbepop
    Beiträge
    1.973
    hiho,

    erstmal gz zur veröffentlichung deines systems. =)

    was mir grad noch einfällt wäre vllt eine temporäre bedingung für quest objects,
    sodass man z.b. die bestimmte anzahl an einheiten innerhalb einer angegebenen zeiteinheit töten muss um die quest erfolgreich zu beenden.

    mfg Robbepop

  3. #3
    Benutzerbild von Kricz
    Registriert seit
    Apr 2008
    BNet Account
    Kricz
    Beiträge
    1.942
    Ist easy machbar, dafür muss ich nurnoch das Quest-Failen richtig beenden, was zZ nur teilweise funktioniert. Wäre im Prinzip das selbe wie das KillQuestObject Struct nur mit einem periodischem Timer drinnen oder einem Timer, der nach ner bestimmten Zeit ausläuft, kann dir den Code noch dafür iwann schicken^^
    Dota 2
    >> Besucht uns im neuen ingame Portal inDota2! <<

  4. #4
    Morgen,

    erstmal dickes Lob an dich. Hervorragende Arbeit! Falls ich was übersehen habe, wäre mein Vorschlag, dass man eine Aufgabe mehrmals machen kann. Beispiel:

    Quest 1/3: Kille 5 Grunts --> dafür bekommst du x-Gold
    Quest 2/3: Kille 10 Grunts --> "----------------" x-Gold
    Quest 3/3: Kille 20 Grunts --> "----------------" x-Gold + ein unique Item

    Das müsste natürlich Multiplayer tauglich sein.

    Beste Grüße
    Patrick


    An Wiederholbare Quests hatte ich auch schon gedacht, nur ist dies ein wenig schwer mit Quest-Belohnungen, wie folgendes Beispiel beweist (in meinem ItemQuestGiver)

    2 Spieler sind ingame
    Spieler 1 nimmt Quest an, Spieler 2 ist afk
    Spieler 1 beendet Quest (somit für alle Spieler) und nimmt die Quest wieder an.
    Spieler 2 hat die Quest immernoch nicht abgegeben beim Questgeber, während Spieler 1 die Quest ein zweites mal beendet.
    Spieler 2 müsste die Quest dann 2x abgeben können, was aber nicht möglich ist, da ich keine 2D-Variablen innerhalb von Structs machen kann...
    Wenn dies ginge wäre das kein Problem

    Möglich wäre dies jedoch mit mehreren Quests, sprich Folgequests, siehe unten


    Kam noch nit zum vollständigen ansehen, gibt es eine Möglichkeit für Folgequests?
    Wie ich schon erwähnt hatte, mehrere Quests machen, und den QuestEvent-Struct durch das Function Interface eine Funktion hinzufügen, welche das nächste QuestEvent aktiviert. Das kannste halt unendlich oft machen, für jede einzelne Quest das Selbe.


    Bin derzeit dabei, das Quest failen zu implementieren, zusammen mit Robbepops frage, sprich Quests mit Zeitbedingung.
    Geändert von Kricz (08. Dezember 2010 um 13:36 Uhr)


  5. #5
    Staff Maps
    Projektbetreuung

    Mappinghelfer des Monats
    Benutzerbild von Der sensige Derwisch
    Registriert seit
    Apr 2009
    Ort
    irgendwo im nirgendwo
    BNet Account
    Der_Wisch
    Beiträge
    2.487
    Zitat Zitat von pred1980 Beitrag anzeigen
    Morgen,

    erstmal dickes Lob an dich. Hervorragende Arbeit! Falls ich was übersehen habe, wäre mein Vorschlag, dass man eine Aufgabe mehrmals machen kann. Beispiel:

    Quest 1/3: Kille 5 Grunts --> dafür bekommst du x-Gold
    Quest 2/3: Kille 10 Grunts --> "----------------" x-Gold
    Quest 3/3: Kille 20 Grunts --> "----------------" x-Gold + ein unique Item

    Das müsste natürlich Multiplayer tauglich sein.

    Beste Grüße
    Patrick
    Das ließe sich wiederum durch mehrere quests lösen nicht?

    Kam noch nit zum vollständigen ansehen, gibt es eine Möglichkeit für Folgequests?

  6. #6
    Benutzerbild von Kricz
    Registriert seit
    Apr 2008
    BNet Account
    Kricz
    Beiträge
    1.942
    Zitat Zitat von pred1980 Beitrag anzeigen
    Morgen,

    erstmal dickes Lob an dich. Hervorragende Arbeit! Falls ich was übersehen habe, wäre mein Vorschlag, dass man eine Aufgabe mehrmals machen kann. Beispiel:

    Quest 1/3: Kille 5 Grunts --> dafür bekommst du x-Gold
    Quest 2/3: Kille 10 Grunts --> "----------------" x-Gold
    Quest 3/3: Kille 20 Grunts --> "----------------" x-Gold + ein unique Item

    Das müsste natürlich Multiplayer tauglich sein.

    Beste Grüße
    Patrick
    Das ließe sich wiederum durch mehrere quests lösen nicht?

    Joa, wäre somit machbar, wiederholbare Quests sind noch in Überlegung, wie ich die machen könnte...

    Kam noch nit zum vollständigen ansehen, gibt es eine Möglichkeit für Folgequests?

    Joa, ist auf 2 Wege möglich. Entweder, indem du der Quest ein Function Interface vom Typ <onQuestFinish> addest, welche bereits implementiert sind, oder, dem QuestEvent eine <EventOnQuestComplete> function hinzufügen, welche noch nicht implementiert sind. Bei dem ersten Weg sähe es so aus:



    globals
    private Quest1
    private Quest2
    endglobals

    function activateQuest2 takes Quest whichQuest, boolean failed returns nothing
    if whichQuest == Quest1 then
    call Quest2.qEvent.enable()
    endif
    endfunction

    function onInit takes nothing returns nothing
    set Quest1 = //create Quest1
    set Quest2 = //create Quest2

    set Quest1.onEnd = activateQuest2
    endfunction



    So ungefähr könnte das aussehen, vom Prinzip her. Dann würde das QuestEvent von Quest2 enabled, sobald alle Bedingungen von Quest1 erfüllt worden sind.


    Edit:
    Wird ein wenig dauern, bis die nächste Version kommt, da ich einige neue Features und Templates für QuestEvents usw einfügen werde. Zudem werd ich mehr Quests einbauen und ein paar andere Sachen. Hab mir als Ziel spätestens Freitag gesetzt!

    Edit 2:
    Die QuestEvent Library wird größtenteils umgeschrieben, sodass diese zwei Typen von QuestEvents hat, wobei eines das QuestGiver und das andere der QuestCompleter Struct ist, in welche Custom Quest Events jetzt je nachdem extended werden müssen. Der Grund dafür ist, dass der User dann mehr Möglichkeiten und mehr Kombinationen hat, z.B. eine Quest durch das Benutzen eines Items aktivieren (QuestGiver) und durch das Sprechen mit einer Person die Quest beenden (QuestCompleter).
    Macht insgesamt weniger Arbeit für den Benutzer, da man nicht so viele QuestEvents machen müsste. Atm. müsste man für das Beispiel oben ein eigenes Struct wieder machen, welches diese beiden Sachen kombiniert.


    Edit 3:
    Alles, was ich im zweiten Edit geschrieben habe, ist soweit fertig und scheint stable zu sein...




    Edit 4:
    Okay, Planänderung! Wird noch ein wenig länger dauern, bis die nächste Version rauskommt, welche jedoch auch viele neue Features bieten wird. Da ich atm auch viel Schule am Kragen habe, grenzt sich das alles ein wenig ein. Zudem wird die Demo-Map sehr, sehr, sehr viel anders aussehen als die jetzige, sprich, ich werde eine kleine Story einbauen, welche auf Quests basiert, welche Beispiele für neue Quest Objects und Quest Giver/Completer zeigt. Zudem auch Wege, wie man Folgequests machen kann und was mir sonst noch alles einfällt
    Geändert von Kricz (09. Dezember 2010 um 20:30 Uhr)
    Dota 2
    >> Besucht uns im neuen ingame Portal inDota2! <<

  7. #7
    Hallo und guten Morgen Kricz.

    Ich bin sehr interessiert an deinem System, weil wir es auch gerade in Angriff nehmen wollten aber dank dir uns einen großen Aufwand ersparen können. Sag mal besteht die Möglichkeit bei deinem System Team Quest zu machen. Also nach einem bestimmten Fall im Spiel bekommt ein Team die Aufgabe eben irgendwas zu machen, vielleicht auch in einer bestimmten Zeit oder sowas und bekommt am Ende dafür irgend etwas.

    Beste Grüße
    Patrick

    p.s. habe dich im Skype geadded, falls es für dich kein Problem darstellt. Ich denke, da wir dein System auf jeden Fall einsetzen wollen werden sich da bestimmt noch einige Fragen ergeben


  8. #8
    Benutzerbild von SneedZ
    Registriert seit
    Aug 2011
    Ort
    Azeroth
    BNet Account
    SneedZ
    Beiträge
    43
    Ich wollte gerne das System in meinem RPG einbauen jedoch kommt ein vJass-Compile Error. Ich habe alle Triggers,System kopiert und eingefuegt in meine Map jedoch kommt diese Fehleranmeldung von der Library:




    Hoffe jemand kann mir weiterhelfen.

  9. #9
    Staff Maps
    Map-Contests
    Benutzerbild von muzzel
    Registriert seit
    Sep 2008
    Ort
    BaWü
    BNet Account
    muzzel
    Beiträge
    3.229
    "optional" ist ein relativ neues Keyword weshalb ältere Versionen des Jasshelpers nichts damit anzufangen wissen. Abhilfe schafft eine neue Version von Jasshelper oder ganz einfach das neuste JassNewgenPack

    <Argon]> in der zeit, in der ich das mit tikz gebastelt hab, hätt ich das als 2m^2 holzskulptur schnitzen können
    <Argon]> mit nem Skalpell
    Penguin World Domination - be part of it!
    » LaTeX2png Converter | Gaias Retaliation ORPG | Ulumulu Entertainment | AAT

  10. #10
    Benutzerbild von SneedZ
    Registriert seit
    Aug 2011
    Ort
    Azeroth
    BNet Account
    SneedZ
    Beiträge
    43
    Ist Lite die aktuellste version bis heute?

    edit: hat funktioniert dank dir
    Geändert von SneedZ (04. September 2011 um 00:15 Uhr)

  11. #11
    Staff Maps
    Map-Contests
    Benutzerbild von muzzel
    Registriert seit
    Sep 2008
    Ort
    BaWü
    BNet Account
    muzzel
    Beiträge
    3.229
    Die Lite beinhaltet die aktuellsten Komponenten, ist allerdings keine offizielle JNGP version. Frotty hat sie für InWC zusammengestellt mit den meist benutzten und wichtigsten Komponenten.
    Ist aber sehr zu empfehlen sie zu benutzen, besonders wenn man nicht genau weiss was man braucht (Die anderen Versionen beinhalten auch Tools die eher hinderlich sind und für fast alle Zwecke deaktiviert werden sollten, z.b. RtC und UMSWE).

    <Argon]> in der zeit, in der ich das mit tikz gebastelt hab, hätt ich das als 2m^2 holzskulptur schnitzen können
    <Argon]> mit nem Skalpell
    Penguin World Domination - be part of it!
    » LaTeX2png Converter | Gaias Retaliation ORPG | Ulumulu Entertainment | AAT

Ähnliche Themen

  1. "Quest-System" - Beenden fehler
    Von McThyzer im Forum Triggerforum
    Antworten: 2
    Letzter Beitrag: 03. Januar 2009, 20:37
  2. Jass Problem mit Quest System
    Von McThyzer im Forum Allgemeine Mappingfragen
    Antworten: 9
    Letzter Beitrag: 28. September 2008, 23:06
  3. Quest System Fehler
    Von enDGeiL im Forum Allgemeine Mappingfragen
    Antworten: 2
    Letzter Beitrag: 20. Mai 2008, 22:24
  4. Frage zu Quest-System
    Von Trunk im Forum Triggerforum
    Antworten: 0
    Letzter Beitrag: 08. März 2008, 18:28
  5. Mein Quest System
    Von TBx_Illidan im Forum Material
    Antworten: 2
    Letzter Beitrag: 02. März 2008, 15:40

Forumregeln

  • Es ist dir nicht erlaubt, neue Themen zu verfassen.
  • Es ist dir nicht erlaubt, auf Beiträge zu antworten.
  • Es ist dir nicht erlaubt, Anhänge hochzuladen.
  • Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
  •