Paste #66255: adfsdfafdsaf

Date: 2020/03/19 07:17:59 UTC-07:00
Type: Denizen Script

View Raw Paste Download This Paste
Copy Link


# mythicmobs item give command
#- execute as_op "mm i give <player.name> item"
# url skin command
# /npc skin --url 

# CHAT COLORS #
darkRedChat:
  type: format
  format: "<&4><npc.name><&co> <&f><text>" 
redChat:
  type: format
  format: "<&c><npc.name><&co> <&f><text>"
goldChat:
  type: format
  format: "<&6><npc.name><&co> <&f><text>"
yellowChat:
  type: format
  format: "<&e><npc.name><&co> <&f><text>"
greenChat:
  type: format
  format: "<&a><npc.name><&co> <&f><text>"
darkGreenChat:
  type: format
  format: "<&2><npc.name><&co> <&f><text>"
aquaChat:
  type: format
  format: "<&b><npc.name><&co> <&f><text>"
darkAquaChat:
  type: format
  format: "<&3><npc.name><&co> <&f><text>"
blueChat:
  type: format
  format: "<&9><npc.name><&co> <&f><text>"
darkBlueChat:
  type: format
  format: "<&1><npc.name><&co> <&f><text>"
purpleChat:
  type: format
  format: "<&d><npc.name><&co> <&f><text>"
darkPurpleChat:
  type: format
  format: "<&5><npc.name><&co> <&f><text>"
grayChat:
  type: format
  format: "<&7><npc.name><&co> <&f><text>"
darkGrayChat:
  type: format
  format: "<&8><npc.name><&co> <&f><text>"
blackChat:
  type: format
  format: "<&0><npc.name><&co> <&f><text>"
whiteChat:
  type: format
  format: "<&f><npc.name><&co> <text>"

# quest chat #
questChat:
  type: format
  format: "<&7>[<&e><text><&7>]"
descChat:
  type: format
  format: "<&7>--<&gt> <&f><text>"

# kill quest #
exampleKillQuest:
  type: assignment
  actions:
    on assignment:
    - trigger name:click state:true
    - trigger name:chat state:true
  interact scripts:
  - 10 exampleKQInteract

exampleKQInteract:
  type: interact
  steps:
      1:
          click trigger:
            script:
            - if <player.has_flag[npc_engaged]> queue clear
            - if <player.has_flag[example_kill_quest_cooldown]> {
              - narrate "You can accept this quest again in <player.flag[example_kill_quest_cooldown].expiration.formatted>"
              - queue clear
            }
            - if <player.flag[example_kill_quest]> queue clear
            - flag player npc_engaged
            - if <player.flag[example_kill_quest_count]> == 5 {
              - narrate format:blueChat "Oh thank you for taking down those zombies!"
              - give diamond quantity:5
              - narrate "<&7>[<&f>Kill 5 Zombies: Quest Complete!<&7>]"
              - flag player example_kill_quest_count:!
              - flag player example_kill_quest_cooldown duration:24h
              - flag player example_kill_quest:!
              - disengage
              - flag player npc_engaged:!
              - queue clear
            }
            - engage
            - narrate format:blueChat "Hello, would you be able to help me with something?"
            - wait 5t
            - narrate format:blueChat "I need some zombies killed, they're terrorizing the village!"
            - wait 5t
            - narrate "<&7>[<&f>Type <&a>Yes <&f>or <&c>No<&7>]"
            - disengage
            - flag player npc_engaged:!
          chat trigger:
            1:
              trigger: /Yes/, I accept!
              script:
              - if <player.flag[example_kill_quest_cooldown]> {
                -queue clear
                }
              - if <player.has_flag[example_kill_quest]> queue clear
              - engage
              - narrate format:blueChat "Great! Here's the quest" 
              - wait 5t
              - narrate "<&7>[<&f>Kill 5 Zombies: Quest Begin!<&7>]"
              - flag player example_kill_quest
              - flag player example_kill_quest_count:0
              - disengage
            2:
              trigger: /No/, I'm busy.
              script: 
              - if <player.has_flag[example_kill_quest]> queue clear
              - narrate format:blueChat "denyReply"
example_kill_quest_world:
  type: world
  events:
    on player kills zombie:
    - if !<player.has_flag[example_kill_quest]> queue clear
    - flag player example_kill_quest_count:++
    - if <player.flag[example_kill_quest_count]> == 5 {
      - narrate "<&7>[<&f>Kill 5 Zombies: Return to NPC<&7>]"
      - flag player example_kill_quest:!
    }

# retrieval quest #
exampleRetrievalQuest:
  type: assignment
  actions:
    on assignment:
    - trigger name:click state:true
    - trigger name:chat state:true
  interact scripts:
  - 10 exampleRQInteract

exampleRQInteract:
  type: interact
  steps:
      1:
          click trigger:
            script:
            - if <player.has_flag[npc_engaged]> queue clear
            - if <player.has_flag[example_retrieval_quest_cooldown]> {
              - narrate "You can accept this quest again in <player.flag[example_retrieval_quest_cooldown].expiration.formatted>"
              - queue clear
              }
            - if <player.inventory.contains[GOLD_INGOT].quantity[5]> {
              - take gold_ingot quantity:5
              - narrate format:redChat "Oh, you have five ingots! I'll be taking those."
              - give diamond quantity:5
              - narrate "<&7>[<&f>Five Gold Ingots: Quest Complete!<&7>]"
              - flag player example_retrieval_quest_cooldown duration:24h
              - flag player example_retrieval_quest:!
              }
            - if <player.flag[example_retrieval_quest]> queue clear
            - flag player npc_engaged
            - engage
            - narrate format:redChat "Help! Help!"
            - wait 5t
            - narrate format:redChat "You there, can you help me gather some ingots?"
            - wait 5t
            - narrate "<&7>[<&f>Type <&a>Yes <&f>or <&c>No<&7>]"
            - disengage
            - flag player npc_engaged:!
          chat trigger:
            1:
              trigger: /Yes/, how can I help?
              script:
              - if <player.flag[example_retrieval_quest_cooldown]> queue clear
              - if <player.has_flag[example_retrieval_quest]> queue clear
              - engage
              - narrate format:redChat "Great! I need five golden ingots, STAT!" 
              - wait 5t
              - narrate "<&7>[<&f>Five Gold Ingots: Quest Begin!<&7>]"
              - flag player example_retrieval_quest
              - disengage
            2:
              trigger: /No/, I can't.
              script: 
              - if <player.has_flag[example_retrieval_quest]> queue clear
              - narrate format:redChat "That's okay.." 

# regular dialogue #
exampleDialogue:
  type: assignment
  actions:
    on assignment:
    - trigger name:click state:true
    - trigger name:chat state:true
  interact scripts:
  - 10 exampleDialogueInteract

exampleDialogueInteract:
  type: interact
  steps:
      1:
          click trigger:
            script:
            - if <player.has_flag[npc_engaged]> queue clear
            - flag player npc_engaged
            - engage
            - narrate format:goldChat "Hi, friend! How goes it?"
            - wait 5t
            - narrate "<&7>[<&f>Type a number 1-3 or say <&6>bye<&7>]"
            - wait 5t
            - narrate "<&7>(<&f>1<&7>) <&f> I am well, and you?"
            - narrate "<&7>(<&f>2<&7>) <&f> Tell me about yourself."
            - narrate "<&7>(<&f>3<&7>) <&f> WAH!"
            - disengage
            - flag player npc_engaged:!
          chat trigger:
            1:
              trigger: /1/
              script:
              - engage
              - narrate format:goldChat "I am doing well, too! Have a wonderful day."
              - disengage
            2:
              trigger: /2/
              script: 
              - engage
              - random {
                - narrate format:goldChat "I'm a fair rancher in this land."
                - narrate format:goldChat "I like to tend to my animals. Aren't they lovely?"
                - narrate format:goldChat "I don't have much of a family, but my animals keep me company and make me feel at home."
                }
              - disengage
            3:
              trigger: /3/
              script:
              - engage
              - narrate format:goldChat "..."
              - wait 20t
              - narrate format:goldChat "WAH!"
              - disengage
            4:
              trigger: /Bye/.
              script: 
              - engage
              - narrate format:goldChat "Goodbye!"
              - disengage

# shop
exampleShop:
  type: assignment
  actions:
    on assignment:
    - trigger name:click state:true
    - trigger name:chat state:true
  interact scripts:
  - 10 exampleShopInteract

exampleShopInteract:
  type: interact
  steps:
      1:
          click trigger:
            script:
            - if <player.has_flag[npc_engaged]> queue clear
            - flag player npc_engaged
            - engage
            - narrate format:greenChat "Hey, you there!"
            - wait 5t
            - narrate format:greenChat "Check out my wares!"
            - wait 5t
            - narrate "<&7>[<&f>Type a number or say <&a>bye<&7>]"
            - wait 5t
            - narrate "<&7>(<&f>1<&7>) <&8>Stone Sword <&7>- <&e>50 gold"
            - narrate "<&7>(<&f>2<&7>) <&f>Iron Sword <&7>- <&e>100 gold"
            - narrate "<&7>(<&f>3<&7>) <&b>Diamond Sword <&7>- <&e>250 gold"
            - disengage
            - flag player npc_engaged:!
          chat trigger:
            1:
              trigger: /1/, please.
              script:
              - engage
              - if <player.money> >= 50 {
                - narrate format:greenChat "A stone sword? You got it."
                - give stone_sword
                - take money quantity:50
                } else {
                    - narrate "<&7>You don't have enough money!"
                    }
              - disengage
            2:
              trigger: /2/, please.
              script: 
              - engage
              - if <player.money> >= 100 {
                - narrate format:greenChat "One iron sword, coming right up" 
                - give iron_sword
                - take money quantity:100
                }  else {
                    - narrate "<&7>You don't have enough money!"
                    }
              - disengage
            3:
              trigger: /3/, please.
              script: 
              - engage
              - if <player.money> >= 250 {
                - narrate format:greenChat "Here's a diamond sword, for you."
                - give diamond_sword
                - take money quantity:250
                } else {
                    - narrate "<&7>You don't have enough money!"
                    }
              - disengage
            4:
              trigger: /Bye/.
              script: 
              - engage
              - narrate format:greenChat "Farewell traveler." 
              - disengage

# handler scripts
skin_url_handler:
    type: world
    debug: false
    events:
        on npc command:
            - if <c.args.get[1].to_lowercase||null> != skin:
                - queue clear
            - if !<li@-u|--url.contains[<c.args.get[2].to_lowercase||null>]>:
                - queue clear
            - determine passively fulfilled

            - define url <c.args.get[3]||null>
            - define model <c.args.get[4].to_lowercase||empty>
            - if <c.server>:
                - define npc <server.selected_npc||null>
            - else:
                - define npc <player.selected_npc||null>

            - if <def[npc]> == null:
                - narrate "<&a>You must have an NPC selected to execute that command."
                - queue clear
            - if <def[npc].entity_type> != PLAYER:
                - narrate "<&a>You must have a player-type NPC selected."
                - queue clear
            - if <def[url]> == null:
                - narrate "<&a>You must specify a valid skin URL."
                - queue clear
            - if <def[model]> != empty && <def[model]> != slim:
                - narrate "<&e><def[model]><&a> is not a valid skin model. Must be <&e>slim<&a> or empty."
                - queue clear

            - narrate "<&a>Retrieving the requested skin..."
            - define key <util.random.uuid>

            # Our own custom ~5s timeout since the builtin hangs
            - run skin_url_task def:<def[key]>|<def[url]>|<def[model]> id:<def[key]> instantly
            - while <queue.exists[<def[key]>]>:
                - if <def[loop_index]> > 20:
                    - queue q@<def[key]> clear
                    - narrate "<&a>The request timed out. Is the url valid?"
                    - queue clear
                - wait 5t

            # Quick sanity check - ideally this should never be true
            - if !<server.has_flag[<def[key]>]>:
                - queue clear

            - if <server.flag[<def[key]>]> == null:
                - narrate "<&a>Failed to retrieve the skin from the provided link. Is the url valid?"
                - flag server <def[key]>:!
                - queue clear

            - yaml loadtext:<server.flag[<def[key]>]> id:response

            - if !<yaml[response].contains[data.texture]>:
                - narrate "<&a>An unexpected error occurred while retrieving the skin data. Please try again."
            - else:
                - narrate "<&e><def[npc].name><&a>'s skin set to <&e><def[url]><&a>."
                - adjust <def[npc]> skin_blob:<yaml[response].read[data.texture.value]>;<yaml[response].read[data.texture.signature]>

            - flag server <def[key]>:!
            - yaml unload id:response

skin_url_task:
    type: task
    debug: false
    definitions: key|url|model
    script:
        - define req "https://api.mineskin.org/generate/url"
        - if <def[model]> == slim:
            - define req "<def[req]>?model=slim"
        - ~webget <def[req]> "post:url=<def[url]>" timeout:5s save:res
        - flag server <def[key]>:<entry[res].result||null>