Description: This contains a script intended to be used as a framework to add a store or other interactive npc. On spawn, the npc will wander around aimlessly around a central location. If the player clicks, they will return to the center and further interaction will be possible. When the player then leaves, the npc will continue 'fidgeting'. If you use this framework run the fidgeting script on multiple kinds of npcs, make sure that their interact scripts have different names.
.asint bug has been fixed, this now works properly in all quadrants.
Update: 3/6/12
-made a slightly cleaner despawn (still needs work)
-added ability for npc to sit if it ends movement or within one block of a wooden slab. For the sake of reliability, I have required the wood slab "chairs" to be on the same y level as the npc when it is assigned. you can replace flag.npc:fs_spawny with npc.location.y in that gigantic IF statement if you want to have chairs that are on different y levels, but it seems to occasionally take data from the level below. Since this is random and interactive, I opted for normal slabs rather than stairs. I prefer the abstraction of slabs as stools in my particular builds but Im sure you could adapt stairs to be used.
-added some more random dialogue options
-increased the length of some of the delays (need to make these adjustable constants)
-gave npc a fixed spawn location on assignment, which always use as the default center point
-made the npc lookclose while waiting to move again
# Updated: 3/6/2013# for Denizen 0.8.8+# requires citizens2 and craftbukkit# Place these scripts in the /plugins/Denizen/scripts folder.# From here to the task 'buystuffexample' is the framework for an npc that is using the fidgeting script.# You could get by with less, but I've included some basic flair to give that immersive feeling.
"Shopkeeper":
type: assignment
default constants:
# X-axis wander radius
Width: 5# Z-axis wander radius
Depth: 5
Delay: 10s
Speed: 5
interact scripts:
- 10 Interact Script
actions:
on assignment:
- flag npc "fs_spawnx:<npc.location.x>"
- flag npc "fs_spawnz:<npc.location.z>"
- flag npc "fs_spawny:<npc.location.y>"
- flag npc "fs_spawny:<flag.n:fs_spawny.asint>"
on spawn:
- execute as_npc speed 0.5
- trigger name:click toggle:true radius:3
- trigger name:chat toggle:true radius:5
- trigger name:proximity toggle:true cooldown:1 radius:10
- flag npc "fs_spawned:true"
- flag npc "fs_attention:false"
- flag npc "fs_defaultx:<flag.n:fs_spawnx>"
- flag npc "fs_defaultz:<flag.n:fs_spawnz>"
- runtask "script:Fidgeting" queue
on despawn:
- flag npc "fs_spawned:false"
on complete navigation:
- ^runtask "script:fs_scanforchair"
"Interact Script":
type: interact
steps:
1:
click trigger:
script:
- random 2
- chat "I'll be with you in one moment."
- chat "Just a minute, honey."
- ^flag npc "fs_attention:true"
- zap 2"script:Interact Script"
proximity trigger:
entry:
script:
- random 2
- chat "You look like a man with taste."
- chat "See anything you like?"
2:
proximity trigger:
exit:
script:
- chat "Goodbye."
- ^flag npc "fs_attention:false"
- lookclose toggle:false
- runtask "script:Fidgeting" queue
- zap 1"script:Interact Script"
click trigger:
script:
- chat "Looking for something... special?"
- runtask "script:buystuffexample"
"buystuffexample":
type: task
script:
- chat "Please browse my fine wares."# Here is the meat of the fidgeting script, put this in a separate file for convienience.
"Fidgeting":
type: task
script:
- runtask "script:fs_genrandoms" instantly
- if "<flag.n:fs_spawned>" == "true" && "<flag.n:fs_attention>" == "false"
runtask "script:fs_walk" queue
else if "<flag.n:fs_spawned>" == "false" runtask "script:fs_despawn"
else runtask "script:fs_waittoleave"
"fs_genrandoms":
type: task
script:
- ^flag npc "fs_randomx:<util.random.int[0].to[<cons:Width>]>"
- ^flag npc "fs_randomz:<util.random.int[0].to[<cons:Depth>]>"
- ^flag npc "fs_randomposx:<flag.n:fs_defaultx>"
- random 2
- ^flag npc "fs_randomposx:-:<flag.n:fs_randomx>"
- ^flag npc "fs_randomposx:+:<flag.n:fs_randomx>"
- ^flag npc "fs_randomposx:<flag.n:fs_randomposx.asint>"
- ^flag npc "fs_randomposz:<flag.n:fs_defaultz>"
- random 2
- ^flag npc "fs_randomposz:-:<flag.n:fs_randomz>"
- ^flag npc "fs_randomposz:+:<flag.n:fs_randomz>"
- ^flag npc "fs_randomposz:<flag.n:fs_randomposz.asint>"
"fs_walk":
type: task
script:
- stand
- walkto "location:<flag.n:fs_randomposx>,<npc.location.y>,<flag.n:fs_randomposz>,<npc.location.world>"
- lookclose toggle:true
- wait 10
- lookclose toggle:false
- runtask "script:Fidgeting" queue
"fs_return":
type: task
script:
- stand
- walkto "location:<flag.n:fs_defaultx>,<npc.location.y>,<flag.n:fs_defaultz>,<npc.location.world>"
- lookclose toggle:true
- wait 20
- lookclose toggle:false
- runtask "script:Fidgeting" queue
"fs_waittoleave":
type: task
script:
- walkto "location:<flag.n:fs_defaultx>,<npc.location.y>,<flag.n:fs_defaultz>,<npc.location.world>"
- lookclose toggle:true
"fs_despawn":
type: task
script:
- chat "Take this job and shove it!"
"fs_scanforchair":
type: task
script:
- ^flag npc "fs_scanx1:<npc.location.x>"
- ^flag npc "fs_scanx2:<npc.location.x>"
- ^flag npc "fs_scanz1:<npc.location.z>"
- ^flag npc "fs_scanz2:<npc.location.z>"
- ^flag npc "fs_scanx1:+:1"
- ^flag npc "fs_scanx2:-:1"
- ^flag npc "fs_scanz1:+:1"
- ^flag npc "fs_scanz2:-:1"
- ^flag npc "fs_scanx1:<flag.n:fs_scanx1.asint>"
- ^flag npc "fs_scanx2:<flag.n:fs_scanx2.asint>"
- ^flag npc "fs_scanz1:<flag.n:fs_scanz1.asint>"
- ^flag npc "fs_scanz2:<flag.n:fs_scanz2.asint>"
- if "<location[<npc.location>].block.material>" == "WOOD_STEP" sit "location:<npc.location>"
else if "<location[<flag.n:fs_scanx1>,<flag.npc:fs_spawny>,<flag.n:fs_scanz1>,<npc.location.world>].block.material>" == "WOOD_STEP" sit "location:<flag.n:fs_scanx1>,<flag.npc:fs_spawny>,<flag.n:fs_scanz1>,<npc.location.world>"
else if "<location[<flag.n:fs_scanx1>,<flag.npc:fs_spawny>,<npc.location.z>,<npc.location.world>].block.material>" == "WOOD_STEP" sit "location:<flag.n:fs_scanx1>,<flag.npc:fs_spawny>,<npc.location.z>,<npc.location.world>"
else if "<location[<flag.n:fs_scanx1>,<flag.npc:fs_spawny>,<flag.n:fs_scanz2>,<npc.location.world>].block.material>" == "WOOD_STEP" sit "location:<flag.n:fs_scanx1>,<flag.npc:fs_spawny>,<flag.n:fs_scanz2>,<npc.location.world>"
else if "<location[<npc.location.x>,<flag.npc:fs_spawny>,<flag.n:fs_scanz1>,<npc.location.world>].block.material>" == "WOOD_STEP" sit "location:<npc.location.x>,<flag.npc:fs_spawny>,<flag.n:fs_scanz1>,<npc.location.world>"
else if "<location[<npc.location.x>,<flag.npc:fs_spawny>,<flag.n:fs_scanz2>,<npc.location.world>].block.material>" == "WOOD_STEP" sit "location:<npc.location.x>,<flag.npc:fs_spawny>,<flag.n:fs_scanz2>,<npc.location.world>"
else if "<location[<flag.n:fs_scanx2>,<flag.npc:fs_spawny>,<flag.n:fs_scanz1>,<npc.location.world>].block.material>" == "WOOD_STEP" sit "location:<flag.n:fs_scanx2>,<flag.npc:fs_spawny>,<flag.n:fs_scanz1>,<npc.location.world>"
else if "<location[<flag.n:fs_scanx2>,<flag.npc:fs_spawny>,<npc.location.z>,<npc.location.world>].block.material>" == "WOOD_STEP" sit "location:<flag.n:fs_scanx2>,<flag.npc:fs_spawny>,<npc.location.z>,<npc.location.world>"
else if "<location[<flag.n:fs_scanx2>,<flag.npc:fs_spawny>,<flag.n:fs_scanz2>,<npc.location.world>].block.material>" == "WOOD_STEP" sit "location:<flag.n:fs_scanx2>,<flag.npc:fs_spawny>,<flag.n:fs_scanz2>,<npc.location.world>"