advanced kill and deliver quest - repeatable/cd


Author: kunrh
Created: 2014-03-24T17:59:38-0400
Edited: 2014-03-24T18:15:00-0400
Denizen Version: 0.9.4-b1434
Views: 14
Downloads: 745
Likes: 1


WGET
Description: This is my first script so please bear with me! ;)

I want to thank "Pigman168" a lot because he answered a ton of my questions and i would not have been able to write this script without him.
If you are a beginner with denizen then i can only recommend coming into the irc-channel because most of your question will get answered and the monkeybot is extremely helpful!

###################################################################
#                                                                 #
#                    kill and deliver quest                       #
#                                                                 #
#   author: kunrh                                                 #
#   version: 1.0                                                  #
#   dScript version: 0.9.4-b1434                                  #
#                                                                 #
#                                                                 #
# For this quest the player has to kill 2 different mobtypes at   #
# the first stage of the quest and then he has to deliver 2       #
# different items at the second stage of the quest.               #
#                                                                 #
# While the player is at the step where he has to kill the mobs   #
# or deliver the items, he can always use the "/quest" command to #
# see what exactly he has to do and how much he has already done. #
#                                                                 #
#                           Usage                                 #
#                                                                 #
# Create a npc with "/npc create [npcname]" and assign him the    #
# quest with "/npc assignment --set killpigsandcows"              #
#                                                                 #
###################################################################

killpigsandcows:
    type: assignment
    debug: false
    actions:
        on assignment:
            - trigger name:chat toggle:true
            - trigger name:click toggle:true
            - lookclose state:true
    default constants:
    # At the first step the player has to kill 2 different mobtypes.
    # Here you can define which mobtypes he has to kill and how many.
        mobtype1: pig
        mobtype1amount: 10
        mobtype2: cow
        mobtype2amount: 10
        # At the second step the player has to deliver 2 different items.
        # I guess it makes the most sense when the player has to deliver
        # the items that the killed mobs drop. Here you can define which
        # items and how many.
        item1: pork
        item1amount: 64
        item2: raw_beef
        item2amount: 64
        # This quest is repeatable but it has a cooldown after finishing
        # it. You can change the cooldown time here. Use "1s" for 1 second,
        # "5m" for 5 minutes or "24h" for 24 hours.
        questredodelay: 20h
        # After completing the quest the player gets a money reward. You
        # can change the amount of money here.
        moneyreward: 10000
    interact scripts:
        - 10 pigcowquest
 
# There are no further comments because if you want to change something, which is highly
# recommended and probably needed if your server isnt german, you should understand it anyways.
pigcowquest:
    type: interact
    steps:
        "*meet":
            click trigger:
                script:
                    - if <player.flag[pigcowquest]> != done {
                      - random {
                        - ^chat "Hallo <player.name>."
                        - ^chat "Hi <player.name>."
                        - ^chat "Moin <player.name>."
                        }
                      - wait 1
                      - random {
                        - ^chat "Ich brauche noch einige Zutaten für das heutige Essen!"
                        - ^chat "Einige Zutaten für das heutige Essen wurden noch nicht geliefert!"
                        - ^chat "Uns wurde heute zu wenig Fleisch geliefert!"
                        }
                      - wait 1
                      - random {
                        - ^chat "Kannst du mir helfen?"
                        - ^chat "Hilfst du mir?"
                        }
                      - wait 1
                      - ^narrate "<&6>Schreibe <&a>Ja<&6> oder <&c>Nein<&6>!"
                      - zap step:accept duration:20s
                      } else {
                      - random {
                        - ^chat "Danke nochmal für das Fleisch!"
                        - ^chat "Ohne dich wären bestimmt einige verhungert!"
                        - ^chat "Wenn du mir nicht geholfen hättest, hätte es wahrscheinlich einen Aufstand gegeben!"
                        }
                      - wait 2
                      - random {
                        - ^chat "Melde dich morgen nochmal, vielleicht brauche ich dann wieder welches!"
                        - ^chat "Momentan haben wir genügend Fleisch. Schau morgen nochmal vorbei!"
                        }
                      }

        accept:
            chat trigger:
                "yes":
                    trigger: "/Ja/, ich werde dir helfen."
                    script:
                        - wait 1
                        - ^narrate "<&5>Steak Tag <&6>- Quest gestartet"
                        - wait 1
                        - random {
                          - ^chat "Heute soll es ordentlich Fleisch geben!"
                          - ^chat "Wir brauchen unbedingt Fleisch!"
                          - ^chat "Wir haben zu wenig Schnitzel!"
                          }
                        - wait 1
                        - ^chat "Töte <cons:mobtype1amount> Schweine und <cons:mobtype2amount> Kühe und bringe mir dann <cons:item1amount> rohes Schweine- und <cons:item2amount> rohes Kuhfleisch!"
                        - ^flag player mob1count:0
                        - ^flag player mob2count:0
                        - ^flag player "questaufgabe:->:<&5>[Steak Tag]<&f> Töte <player.flag[mob1count].as_int>/<cons:mobtype1amount> Schweine und <player.flag[mob2count].as_int>/<cons:mobtype2amount> Kühe!"
                        - ^listen kill "id:Schwein Listener" type:entity name:<cons:mobtype1> qty:1 script:mob1check
                        - ^listen kill "id:Kuh Listener" type:entity name:<cons:mobtype2> qty:1 script:mob2check
                        - zap step:huntpigcow
                        
                "no":
                    trigger: "/Nein/, ich hab gerade keine Zeit."
                    script:
                        - wait 1
                        - random {
                          - ^chat "Schade, dann werde ich mal jemand anderes fragen."
                          - ^chat "Ok, hoffentlich hilft mir jemand anderes."
                          }
                        - wait 1
                        - random {
                          - ^chat "Solltest du doch irgendwann Zeit haben, dann melde dich einfach nochmal bei mir!"
                          - ^chat "Sprich mich einfach nochmal an, wenn du Zeit haben solltest."
                          }
                        - zap step:meet
                        
                "everything else":
                    trigger: /REGEX:\w+/
                    script:
                        - wait 1
                        - random {
                          - ^chat "Tut mir leid <player.name>, aber ich weiß nicht was <&sq><&f><context.message><&9><&sq> bedeutet!"
                          - ^chat "Ich weiß nicht, was du mit <&sq><&f><context.message><&9><&sq> meinst!"
                          }
                        - wait 1
                        - ^narrate "<&6>Schreibe <&a>Ja<&6> oder <&c>Nein<&6>!"

        huntpigcow:
            click trigger:
                script:
                    - ^chat "<player.name>, du hast erst <player.flag[mob1count].as_int>/<cons:mobtype1amount> Schweine und <player.flag[mob2count].as_int>/<cons:mobtype2amount> Kühe getötet!"
                    - wait 1
                    - ^chat "Komm wieder, wenn du 10 Schweine und 10 Kühe getötet hast!"
                    
        whiledelivering:
            click trigger:
                script:
                    - ^if <player.item_in_hand.material> == m@<cons:item1> {
                      - ^if <player.flag[item1delivered].as_int> < <cons:item1amount> {
                        - ^define item_in_hand <player.item_in_hand.qty>
                        - ^define toomuch <math.as_int:64-<player.flag[item1delivered]>>
                        - ^flag player "questaufgabe:<-:<&5>[Steak Tag]<&f> Bringe der Küchenhilfe <player.flag[item1delivered].as_int>/<cons:item1amount> rohes Schweine- und <player.flag[item2delivered].as_int>/<cons:item2amount> rohes Kuhfleisch!"
                        - ^flag player item1delivered:++:<player.item_in_hand.qty>
                        - ^take i@<cons:item1> qty:<player.item_in_hand.qty>
                        - ^if <player.flag[item1delivered].as_int> < <cons:item1amount> {
                          - ^chat "Danke für %item_in_hand% rohes Schweinefleisch!"
                          - ^flag player "questaufgabe:->:<&5>[Steak Tag]<&f> Bringe der Küchenhilfe <player.flag[item1delivered].as_int>/<cons:item1amount> rohes Schweine- und <player.flag[item2delivered].as_int>/<cons:item2amount> rohes Kuhfleisch!"
                          } else {
                            - ^chat "Danke für %toomuch% rohes Schweinefleisch!"
                            - ^flag player item1:done
                            - ^if <player.flag[item1delivered].as_int> > <cons:item1amount> {
                              - ^give i@<cons:item1> qty:<math.as_int:<player.flag[item1delivered]>-<cons:item1amount>>
                              }
                            - ^flag player item1delivered:<cons:item1amount>
                            - ^flag player "questaufgabe:->:<&5>[Steak Tag]<&f> Bringe der Küchenhilfe <player.flag[item1delivered].as_int>/<cons:item1amount> rohes Schweine- und <player.flag[item2delivered].as_int>/<cons:item2amount> rohes Kuhfleisch!"
                            - ^if <player.flag[item1]> == done && <player.flag[item2]> == done {
                              - random {
                                - ^chat "Danke für deine Hilfe. Hier hast du deine Belohnung!"
                                - ^chat "Vielen Dank! Über <cons:moneyreward> Dollar freust du dich bestimmt!"
                                }
                              - ^give money qty:<cons:moneyreward>
                              - ^narrate "<&2>[<&f>Money<&2>] Received <&f><cons:moneyreward> Dollars <&2>from <&f><npc.name>"
                              - wait 1
                              - ^narrate "<&5>Steak Tag <&6>- Quest abgeschlossen"
                              - ^flag player pigcowquest:done duration:<cons:questredodelay>
                              - ^flag player "questaufgabe:<-:<&5>[Steak Tag]<&f> Bringe der Küchenhilfe <player.flag[item1delivered].as_int>/<cons:item1amount> rohes Schweine- und <player.flag[item2delivered].as_int>/<cons:item2amount> rohes Kuhfleisch!"
                              - ^flag player item1delivered:!
                              - ^flag player item2delivered:!
                              - ^flag player item1:!
                              - ^flag player item2:!
                              - zap script:pigcowquest step:meet
                              } else {
                              - ^chat "Du musst noch etwas rohes Kuhfleisch zu mir bringen!"
                              }
                          }  
                        } else {
                        - ^chat "Du hast bereits genügend rohes Schweinefleisch abgeliefert!"
                        }
                      } else if <player.item_in_hand.material> == m@<cons:item2> {
                        - ^if <player.flag[item2delivered].as_int> < <cons:item2amount> {
                          - ^define item_in_hand <player.item_in_hand.qty>
                          - ^define toomuch <math.as_int:64-<player.flag[item2delivered]>>
                          - ^flag player "questaufgabe:<-:<&5>[Steak Tag]<&f> Bringe der Küchenhilfe <player.flag[item1delivered].as_int>/<cons:item1amount> rohes Schweine- und <player.flag[item2delivered].as_int>/<cons:item2amount> rohes Kuhfleisch!"
                          - ^flag player item2delivered:++:<player.item_in_hand.qty>
                          - ^take i@<cons:item2> qty:<player.item_in_hand.qty>
                          - ^if <player.flag[item2delivered].as_int> < <cons:item2amount> {
                            - ^chat "Danke für %item_in_hand% rohes Kuhfleisch!"
                            - ^flag player "questaufgabe:->:<&5>[Steak Tag]<&f> Bringe der Küchenhilfe <player.flag[item1delivered].as_int>/<cons:item1amount> rohes Schweine- und <player.flag[item2delivered].as_int>/<cons:item2amount> rohes Kuhfleisch!"
                            } else {
                              - ^chat "Danke für %toomuch% rohes Kuhfleisch!"
                              - ^flag player item2:done
                              - ^if <player.flag[item2delivered].as_int> > <cons:item2amount> {
                                - ^give i@<cons:item2> qty:<math.as_int:<player.flag[item2delivered]>-<cons:item2amount>>
                                }
                              - ^flag player item2delivered:<cons:item2amount>
                              - ^flag player "questaufgabe:->:<&5>[Steak Tag]<&f> Bringe der Küchenhilfe <player.flag[item1delivered].as_int>/<cons:item1amount> rohes Schweine- und <player.flag[item2delivered].as_int>/<cons:item2amount> rohes Kuhfleisch!"
                              - ^if <player.flag[item1]> == done && <player.flag[item2]> == done {
                                - random {
                                  - ^chat "Danke für deine Hilfe. Hier hast du deine Belohnung!"
                                  - ^chat "Vielen Dank! Über <cons:moneyreward> Dollar freust du dich bestimmt!"
                                  }
                                - ^give money qty:<cons:moneyreward>
                                - ^narrate "<&2>[<&f>Money<&2>] Received <&f><cons:moneyreward> Dollars <&2>from <&f><npc.name>"
                                - wait 1
                                - ^narrate "<&5>Steak Tag <&6>- Quest abgeschlossen"
                                - ^flag player pigcowquest:done duration:<cons:questredodelay>
                                - ^flag player "questaufgabe:<-:<&5>[Steak Tag]<&f> Bringe der Küchenhilfe <player.flag[item1delivered].as_int>/<cons:item1amount> rohes Schweine- und <player.flag[item2delivered].as_int>/<cons:item2amount> rohes Kuhfleisch!"
                                - ^flag player item1delivered:!
                                - ^flag player item2delivered:!
                                - ^flag player item1:!
                                - ^flag player item2:!
                                - zap script:pigcowquest step:meet
                                } else {
                                - ^chat "Du musst noch etwas rohes Schweinefleisch zu mir bringen!"
                                }
                              }  
                          } else {
                          - ^chat "Du hast bereits genügend rohes Kuhfleisch abgeliefert!"
                          }  
                      } else {
                      - random {
                        - ^chat "Ich brauche noch das Fleisch! Du kannst auch einzelne Portionen bringen!"
                        - ^chat "Wo bleibt das Fleisch? Du musst nicht alles auf einmal bringen!"
                        }
                      - wait 1
                      - ^chat "Du hast erst <player.flag[item1delivered].as_int>/<cons:item1amount> rohes Schweinefleisch und <player.flag[item2delivered].as_int>/<cons:item2amount> rohes Kuhfleisch zur mir gebracht!"
                      }
                        
mob1check:
    type: task
    script:
        - ^flag player "questaufgabe:<-:<&5>[Steak Tag]<&f> Töte <player.flag[mob1count].as_int>/<cons:mobtype1amount> Schweine und <player.flag[mob2count].as_int>/<cons:mobtype2amount> Kühe!"
        - ^flag player mob1count:++
        - ^flag player "questaufgabe:->:<&5>[Steak Tag]<&f> Töte <player.flag[mob1count].as_int>/<cons:mobtype1amount> Schweine und <player.flag[mob2count].as_int>/<cons:mobtype2amount> Kühe!"
        - ^narrate "<&5>[QUEST]<&f><&co> Du hast <player.flag[mob1count].as_int>/<cons:mobtype1amount> Schweine getötet!"
        - ^if <player.flag[mob1count].as_int> >= <cons:mobtype1amount> {
          - flag player mob1:done
          - if <player.flag[mob1]> == done && <player.flag[mob2]> == done {
            - narrate "<&5>[QUEST]<&f><&co> Du hast <cons:mobtype1amount> Schweine und <cons:mobtype2amount> Kühe getötet. Bringe der Küchenhilfe <cons:item1amount> rohes Schweine- und <cons:item2amount> rohes Kuhfleisch!"
            - ^flag player "questaufgabe:<-:<&5>[Steak Tag]<&f> Töte <player.flag[mob1count].as_int>/<cons:mobtype1amount> Schweine und <player.flag[mob2count].as_int>/<cons:mobtype2amount> Kühe!"
            - ^flag player mob1count:!
            - ^flag player mob2count:!
            - ^flag player mob1:!
            - ^flag player mob2:!
            - ^flag player item1delivered:0
            - ^flag player item2delivered:0
            - ^flag player "questaufgabe:->:<&5>[Steak Tag]<&f> Bringe der Küchenhilfe <player.flag[item1delivered].as_int>/<cons:item1amount> rohes Schweine- und <player.flag[item2delivered].as_int>/<cons:item2amount> rohes Kuhfleisch!"
            - zap script:pigcowquest step:whiledelivering
            } else {
            - narrate "<&5>[QUEST]<&f><&co> Du musst noch ein paar Kühe töten!"
            }
          } else {
          - ^listen kill "id:Schwein Listener" type:entity name:<cons:mobtype1> qty:1 script:mob1check
          }

mob2check:
    type: task
    script:
        - ^flag player "questaufgabe:<-:<&5>[Steak Tag]<&f> Töte <player.flag[mob1count].as_int>/<cons:mobtype1amount> Schweine und <player.flag[mob2count].as_int>/<cons:mobtype2amount> Kühe!"
        - ^flag player mob2count:++
        - ^flag player "questaufgabe:->:<&5>[Steak Tag]<&f> Töte <player.flag[mob1count].as_int>/<cons:mobtype1amount> Schweine und <player.flag[mob2count].as_int>/<cons:mobtype2amount> Kühe!"
        - ^narrate "<&5>[QUEST]<&f><&co> Du hast <player.flag[mob2count].as_int>/<cons:mobtype2amount> Kühe getötet!"
        - ^if <player.flag[mob2count].as_int> >= <cons:mobtype2amount> {
          - flag player mob2:done
          - if <player.flag[mob1]> == done && <player.flag[mob2]> == done {
            - narrate "<&5>[QUEST]<&f><&co> Du hast <cons:mobtype1amount> Schweine und <cons:mobtype2amount> Kühe getötet. Bring der Küchenhilfe <cons:item1amount> rohes Schweine- und <cons:item2amount> rohes Kuhfleisch!"
            - ^flag player "questaufgabe:<-:<&5>[Steak Tag]<&f> Töte <player.flag[mob1count].as_int>/<cons:mobtype1amount> Schweine und <player.flag[mob2count].as_int>/<cons:mobtype2amount> Kühe!"
            - ^flag player mob1count:!
            - ^flag player mob2count:!
            - ^flag player mob1:!
            - ^flag player mob2:!
            - ^flag player item1delivered:0
            - ^flag player item2delivered:0
            - ^flag player "questaufgabe:->:<&5>[Steak Tag]<&f> Bringe der Küchenhilfe <player.flag[item1delivered].as_int>/<cons:item1amount> rohes Schweine- und <player.flag[item2delivered].as_int>/<cons:item2amount> rohes Kuhfleisch!"
            - zap script:pigcowquest step:whiledelivering
            } else {
            - narrate "<&5>[QUEST]<&f><&co> Du musst noch ein paar Schweine töten!"
            }
          } else {
          - ^listen kill "id:Kuh Listener" type:entity name:<cons:mobtype2> qty:1 script:mob2check
          }
          
quests:
    type: world
    events:
        on quest command:
        - if <player.has_flag[questaufgabe]> {
          - foreach <player.flag[questaufgabe].as_list> {
            - narrate "%value%"
            }
          } else {
          - narrate "Du hast momentan keine Quest!"
          }
        - determine fulfilled




Comments
2014-03-25 01:22:39 - Pigman168:

Very nice job!