Denizen

Meta Documentation | Issue Tracker | New Script Repository | Old Script Repository | Tutorial Videos | Forums
Development builds of this project can be acquired at the provided continuous integration server. These builds have not been approved by the BukkitDev staff. Use them at your own risk.
Denizen uses a pasting service provided by its developers to enable recording of debug sessions. This allows an easy and universal way to troubleshoot a script. It is only used on '/denizen submit', however this service is not endorsed by the BukkitDev staff. Use it at your own risk.
HEY!
This project is moved!
Please download from:
https://www.spigotmc.org/resources/denizen.21039/
View resources at:
This Bukkit page won't be updated much!
About
Hey there! Thanks for using Denizen for Bukkit and Citizens2. Looking for a quick starting guide? Here's the place!
So, what is Denizen? It's is best classified as a scripting platform. Denizen for Bukkit and Citizens2 utilizes the scripting, and various other components provided by DenizenAPI. The scripting component of Denizen features easy to use script containers, replaceable tags, commands, and a queue system. Built aside is a slew of components that deal with many kinds of event handlers, many additional NPC features, a fully-featured variable system (we call them 'flags'), and a rich object-oriented set of features. I encourage users to start small when first getting into Denizen, but rest assured there are tons of features to explore.
Denizen NPCs? Yep, that's right. Denizen is probably best known as a way to create scripted Citizen NPCs. In fact, this whole project started out as an extension to Citizens2. You can use it to make interactive NPCs with the use of Assignment Scripts and Interact Scripts. This is pretty easy to do, and there's a bunch of cool NPC specific (among many other) commands and tags that you can utilize as well.
Here's a small example I call 'cookies'. I normally like to comment my scripts, but this one below is presented without any as to show the flow.
Cookies: type: assignment interact scripts: - 100 Cookie Handler Cookie Handler: type: interact steps: 'Spreading the Word*': click trigger: script: - random 3 - chat 'I like cookies!' - chat 'MMmm.. cookies are favorite!' - chat 'Cocoa and wheat me freak!' chat trigger: 'Cookies': trigger: 'I love /cookie/s!' script: - chat 'Me too!' - narrate '<npc.name> gives you some cookies.' - give i@cookie qty:6 - zap 'step:Cookies given' 'Cookies given': click trigger: script: - chat 'How were the cookies?' - zap 'step:Spreading the Word'
It's a simple 2-step, multi-trigger script that creates a cookie loving NPC. For some reason I think it's funny to name the NPC 'Notch'. Making a NPC use this script couldn't be easier, either. Simply use a bukkit command while having the NPC selected. It looks like this:
/npc assignment --set cookies
Now clicking on your NPC will use Denizen Triggers to activate the script above. An instant Denizen NPC! Cookies is funny, but hardly useful, and it's my personal philosophy that NPCs should be useful. How 'bout a simple healer? This NPC will heal you, but only when you're seriously injured.
Basic Healer: type: assignment interact scripts: - 100 heal me, bro! Heal me, bro!: type: interact steps: "Need a heal?*": click trigger: script: - if '<player.health>' < '<m:<player.health.max> / 2>' { - look <player.location> - chat 'Woah dude, you are <player.health.formatted>! You could use a heal!' - chat 'Just give me another click to get some power!' - zap "Healin'" duration:30s } else { - look <player.location> - chat 'Nice an healthy. Keep it up!' } "Healin'": click trigger: script: - ^zap 'need a heal?' - ^engage - chat "Here goes nothin'!" - playeffect instant_spell <npc.location> qty:25 - playeffect heart <player.location> qty:25 offset:1 - heal <player> - disengage
How do you make a Healer NPC with this script? You guess it! Just select that NPC, and type:
/npc assignment --set 'basic healer'
It's not just for NPCs. I guess I already told you that, but Denizen has some other script types that open up possibilities that extend far beyond it's core functionality of utilizing NPCs. One of my favorite 'simple scripts' that I like to show people is one that my friend Blankiito showed me. The one below is slightly modified, but basically it enables a 'rogue-like feature' that makes a player invisible when sneaking. It's a simple concept, but perfectly illustrates the flow of a Denizen Script.
Rogue: type: world debug: false events: on player starts sneaking: - playeffect <p.location> magic_crit qty:10 - invisible <player> state:true on player stops sneaking: - invisible <player> state:false
Even small scripts can be incredibly useful for your server. Sometimes scripts can replace entire bukkit plugins, and since the 'code' is in Denizen Script, the end result is often times more flexible to you, the server operator. Have a plugin that run some commands every once in awhile? Replace it with a simple Denizen script.
Auto Save Event Handler: type: world debug: false events: on 5:00 in world: - announce 'Autosaving...' - execute as_server 'denizen save' - execute as_server 'citizens save' - execute as_server 'save-all'
Use Denizen to solve problems, or to make features easier to use. Example: If you're familiar with Citizens, you may have realized that WorldGuard's /butcher command is not friendly to mob-type NPCs. It removes them, too, which can be a pain! Why not write your own /butcher command?
Safer Butcher Handler: type: world debug: false events: on sbutcher command: - narrate 'Removing all mob entities within 15 blocks... your NPCs are safe!' - foreach <player.location.find.entities.within[15]> { - if <%value%.is_mob> remove %value% }
Denizen Quests are the best quests. If you're like me, this whole thing started by using the Quester for Citizens1. It featured a fairly simple questing structure to implement things like 'kill quests' and 'collection quests'. When Citizens went to version 2, that functionality was no longer 'core', but no worries Denizen can help! By utilizing Denizen's Player Listeners, simple questing can be done easily, and it's more robust because you can use all the other features implemented by Denizen, too!
So, how do you best get started? This is a question we get all the time. Because of the enormous amount of ways to use and customize Denizen, we suggest that you simply START SMALL! Checking out the videos, scripts, and articles on denizen-docs you're sure to find a comfortable place to start. While scripting, utilize the tools provided, such as the SublimeText2 grammar pack, and the reference and search for meta lookup on this site.
Like any programming language, there is a learning curve with code structure and syntax that will only be overcome by trial and error. While using some user-made scripts can be as easy as dragging-and-dropping, many scripts will likely require at least a basic understanding of the denizen-script structure to fully utilize their features. But don't worry! Denizen is purposefully made to be easy to read and easy to customize! Tags, commands and events are all very verbose, easy to follow. With a little bit of research we know you'll soon be drunken with power, just like us!
Videos
Other useful links
- Denizen Handbook (Outdated kind of, but has some useful information still.)
- User-made beginner's guide
- Citizens2 Wiki
-
View User Profile
-
Send Message
Posted Jun 18, 2013@jessefjxm
If you write the script's logic correctly, that really shouldn't happen. :/
-
View User Profile
-
Send Message
Posted Jun 18, 2013It seems that when multiple players talking to one NPC at the same time ,they can't keep their own script schedule. For example,when they're talking to NPC at once, NPC may ignore what they said ,or even give them incorrect response. Is there any way to solve this problem? :)
-
View User Profile
-
Send Message
Posted Jun 14, 2013@Morphan1
Activating a Switch is mostly impossible? Absolutely not. :) I have lots of quests that use switches extensively and work just fine. If you need help using the command, I can join your server and help you with it.
Here is a Switch example:
- switch state:toggle "location:100,63,100,world"
-
View User Profile
-
Send Message
Posted Jun 14, 2013@Morphan1
I read about ''on [#]:00 in [WORLD_NAME]:' before posting but on denizen handbook says that this is a "24 hours" clock for Minecraft time (that's the reason for "in [WORLD_NAME]"). What I need is for real time, not Minecraft's.
-
View User Profile
-
Send Message
Posted Jun 12, 2013@Jo11yWombat
The Y coordinates seem to always fail in Denizen as far as I can tell, for some reason. Trying to activate a switch is (mostly) impossible.
@Poleatar
Then just have steps for what you want to do. Or you could make them separate scripts, in which case you would change [^zap "step:..."] to [^zap "script:..."]
-
View User Profile
-
Send Message
Posted Jun 12, 2013Is it possible to make NPCs run a different script depending on the player? I'm trying to make a script for palace guard NPCs who cower when I walk by but yell at and kill everyone else.
-
View User Profile
-
Send Message
Posted Jun 12, 2013Could someone please explain to me how to get a denizen to activate a switch? I'm having trouble finding an example, and everything I tried has failed.
-
View User Profile
-
Send Message
Posted Jun 11, 2013@NemesisMate
You could try adding 'on [#]:00 in [WORLD_NAME]:' to your script's events. It goes by a 24-hour clock.
-
View User Profile
-
Send Message
Posted Jun 11, 2013Which is the best way to make a Denizen do something the day I want at the hour I want? (hour of day of real life)
It's possible with a "wait <lotsOfSeconds>" but Isn't there a better way?
-
View User Profile
-
Send Message
Posted Jun 10, 2013Does anyone know if there's permissions for Denizen? Currently all the commands can only be run by ops...
@Mattrock607
Have you checked for errors in your scripts?
-
View User Profile
-
Send Message
Posted Jun 10, 2013I keep getting an issue popping up in my console that reads:
SEVERE Could not pass event PlayerInteractEvent to Denizen v0.8-prerelease
What does this mean? How do I stop that error from happening?
-
View User Profile
-
Send Message
Posted Jun 10, 2013@MCCharlieCraft
I haven't seen a way to do that, but instead of using flags you could use a constant.
The downside to that though is that it can only be a string and it can only be attached to an NPC (not on the player or globally)... Depending on what you're doing, though, it might be useful. I've found many uses for it, since you can call it in code with <cons:NAME>
-
View User Profile
-
Send Message
Posted Jun 8, 2013@mfm200
It's being updated constantly. Check the Development Builds
-
View User Profile
-
Send Message
Posted Jun 8, 2013when will this be updated
-
View User Profile
-
Send Message
Posted Jun 3, 2013I have been looking all over but cant find it.. Is there a way to edit a flags value via in game command?
-
View User Profile
-
Send Message
Posted Jun 3, 2013@kainick
you have to write /npc assign - -set "..." so assign an script
-
View User Profile
-
Send Message
Posted Jun 2, 2013How would one make a script that has different dialogue depending on the player?
I'm trying to make a basic script for my palace guards so if they see me (Poleatar), they'll grovel or say "welcome home, master" or something like that. If it's somebody else, they say "How did you get in here?" or "Get the hell out of here!"
-
View User Profile
-
Send Message
Posted Jun 1, 2013When I try to set an assignment to a NPC using /npc assignment --set "myscriptname" I get in return Unknown Command. Did you mean: /npc age
Plugins:
citizens-2.0.8-SNAPSHOT
BOSEconomy
CommandBook
denizen-0.8.8-PRERELEASE
Vault
WorldEdit
WorldGuard
All plugins are all up to date.
-
View User Profile
-
Send Message
Posted May 25, 2013How can I flag a player that isn't the one talking to the denizen?, example:
- flag player "AnotherPlayerName" myflag
Is this possible?
-
View User Profile
-
Send Message
Posted May 23, 2013Wondering if there's any way to funtion like a command-block - like get random players (@r) in a certain range.
Edit: Help!What's the newest way to set a player as the target of chat command? Whether "target:player.<player.name>" or "target:<player.name>" can't work (Invalid TARGET)