- mcmonkey studios -
Home Page / Pi to one million places / Contact mcmonkey / Donate / Paste Scripts / Denizen Help /
You are browsing as a guest.
Login | Register




Search:

Listing Tutorials...


Namescript injection tutorial
DescriptionScript injection is an alternative way to run task scripts. Pluses include the ability
to use and modify established definitions and context contained in the script. Check out
this tutorial on some simple ways to use script injection.
Full Explanation
# +-----------------------------------
# | Script Injection tutorial
# |
# | Script injection is an alternative way to run task scripts. Pluses include the ability
# | to use and modify established definitions and context contained in the script. Check out
# | this example on some simple ways to use script injection.
# |
# | Take the example of a 'command pack' script that provides a couple of commands for
# | administrators to use. First, a world script since we need to utilize events.


A Cool Command Pack:
  type: world

  # +-- the SET UP --+
  # Let's create a local script that will check for permissions from players. Since
  # some people using this might want to use different criteria on who should be able to
  # use it (ie. group check/permissions check/op check), it's a good idea to expose this
  # for easy modification. Plus, since it's a utility script, we'll call it with inject
  # to reuse the code in each of the commands provided. We'll call it...

  command_permission_check:

  # This just checks op for most basic usage. Add additional comparisons to include more
  # criteria. If the player doesn't meet criteria, clear the queue. Since this code will
  # be injected, it'll clear the queue it was injected to, which in this case is exactly
  # what we need. Clearing the queue will 'cancel' any further execution to the script.

  # But first, determine the script passively fulfilled so it doesn't display a help message.
  # Specifying 'passively' will allow the script to run beyond the 'determination'.

  - determine passively fulfilled
  - if !<player.is_op> {
    - narrate 'You must be an administrator to use this command!'
    - queue clear
    }

  # +-- the PAYOFF --+
  # Here's a couple simple commands that'll use our injected utility script!

  events:

    # | /TEL command - Teleport to your cursor!
    on tel command:

    # Here's the inject usage, check this out. Since all the commands are intended to be
    # for administrators, making a check here for each command would be counterintutitive.
    # Let's instead just inject the command_permission_check local script! If the conditions
    # aren't met, it'll clear the queue so that the command doesn't go through.
    - inject locally command_permission_check

    # Now the command, since we've checked permission...
    - narrate 'Teleporting to <player.location.cursor_on.add[0,2,0]>!'
    - teleport location:<player.location.cursor_on[150].add[0,2,0].with_pose[<player>]>


    # | /REMOVEMOBS command - Remove vanilla mob entities, not NPCs!
    on removemobs command:

    # One more example -- notice the code is exactly the same! That's the point! Changing
    # up the command_permission_check local script will change all usages of the script.
    # Utility scripts are cool!
    - inject locally command_permission_check

    # Now the command, since we've checked permission...
    - narrate 'Removing all mob entities within 15 blocks...!'
    - foreach <player.location.find.entities.within[15]> {
        - if <%value%.is_mob>
          remove %value%
      }


# Just remember. 'RUN' makes a NEW queue, and 'INJECT' uses an EXISTING queue!


Raw CodeRaw Code

Nameusing local scripts tutorial
DescriptionUse local scripts as a way to avoid making unnecessary script containers
or to group together utility task scripts.
Full Explanation
# +--------------------
# | Using Local Scripts tutorial
# |
# | Since Script Containers are stored inside Denizen on a global level,
# | the problem of duplicate container names can become a problem.
# |
# | Using local scripts can be a good way to avoid situations by cutting
# | down on the amount of total script containers needed by allowing task utility
# | scripts to be included in other containers, or grouped together in a single
# | container.

Local Script Tutorial:
  type: task

  # As you probably already know, to run a 'base script' inside a task script
  # the 'run' or 'inject' commands can be used. This requires the name of the
  # script container as an argument in the commands. For example, type
  # /ex run 's@Local Script Tutorial' .. to run the script
  # below.

  script:
  - narrate "This is the 'base script' of this task script container."
  - narrate "The current time is <util.date.time>!"


  # Local Script support by Denizen allows you to stash more scripts. Just specify
  # a new node. To run this script from other containers, specify the script as well as
  # the local script name node with a 'p' or 'path:' prefix. For example, to run the
  # script below, type /ex run 's@Local Script Tutorial' 'p:subscript_1'

  subscript_1:
  - narrate "This is a 'local script' in the task script container 'LocalScript Tutorial'."

  # But wait, there's more! If wanting to run a local script that is within the
  # same container, the run command can be even simpler by specifying 'local'
  # in place of the script name. Take a look at the next two local scripts. Type
  # /ex run 's@Local Script Tutorial' 'p:subscript_2' .. to run the script below
  # which will in turn run 'subscript_3' locally. Notice if you specify locally,
  # the script used is

  subscript_2:
  - narrate "This is the second 'local script' in this task script container."
  - narrate "This script will now run 'subscript_3'."
  - run locally 'subscript_3'

  subscript_3:
  - narrate "Done. This has been a message from subscript_3!"


  # There you have it! Three separate scripts inside a single task script container!
  # Both the 'run' command and 'inject' command support local scripts.


Raw CodeRaw Code

Nameage command and item script/item event example
DescriptionThis script shows a very small example that utilizes the Age Command with the use
of some items scripts and item events. Use /ex give i@aged_wand or /ex give i@baby_wand
and right click an entity.
Full Explanation
# +--------------------
# | Age Command and Item Script/Item Event Example
# |
# | This script shows a very small example that utilizes the Age Command with the use
# | of some items scripts and item events. Use /ex give i@aged_wand or /ex give i@baby_wand
# | and right click an entity.

Age Wands Handler:
  type: world

  events:

    # Check for the player right clicking entities with the baby_wand item
    on player right clicks entity with baby_wand:

    # Play an effect, and run the age command on the entity
    - playeffect <c.entity.location> effect:mob_spell quantity:100 data:1 offset:0.5
    - age <c.entity> baby

    # ...and again for the aged_wand item
    on player right clicks entity with aged_wand:
    - playeffect <c.entity.location> effect:mob_spell quantity:200 data:0 offset:0.5
    - age <c.entity>


# Build item script containers
baby_wand:
  type: item

  material: blaze_rod
  display name: a baby wand
  lore:
  - "This wand is smooth as a baby's bottom."

aged_wand:
  type: item

  material: bone
  display name: an aged wand
  lore:
  - "This wand reeks of old age."


Raw CodeRaw Code

Nameusing format scripts
DescriptionUse format scripts to create preset custom formats for narrate or announce commands.
Full Explanation
# +--------------------
# | Using Format Scripts
# |
# | Format scripts allow you to create custom preset
# | formats for the narrate and announce commands.
# |
# | EG, turn - narrate "hello"
# | into: "MyNPC: hello" with coloring too.

# +-- The Format Script --+
FormatExample:
  # Remember to keep the name short, you're going to be typing it a lot!
  # One possible name is just 'chat'.

  type: format

  # The format script is a very small script
  # with only one line after the type

  # This one line is 'format: <formatting here>'
  format<&b><npc.name><&7><&co> <&2><text>
  # <&b> = cyan text
  # <npc.name> will become the NPC's name
  # <&7> = white text
  # <&co> = a :colon: (You can't directly type one in a message, as it can cause errors)
  # <&2> = green text
  # <text> will become the message

# +-- Elsewhere, in some other script --+
narrate format:FormatExample "Hello there!"
# Assuming the NPC is named 'Bob', This will show to the player:
# Bob: Hello there!
# Except with lots of color.

# You can also do that with announce instead of narrate

# +-- Additional note --+
# Remember, you only need one format script for each style of message
# Don't duplicate the format script in every file
# It's better to make a script file named something like 'UtilFormats.yml'
# And put all your favorite format scripts in there
# any NPC script will be able to use them as well

# ALSO, you can at any time reformat a tag using the tag '<el@element.format[<script>]>'
# EG, <npc.name.format[FormatExample]>


Raw CodeRaw Code