Date: 2015/04/16 17:19:46 UTC-07:00
Type: Denizen Script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
# Fisherman Quest - Repeatable
# Citizens 2 (build #1045)
# Denizen 0.9.3 (build #1417)
#
# To assign to an NPC, type:
# /npc assign --set "fisherman"
#
# Description:
#
# This is a simple repeatable quest that requires the player to bring the Fisherman some..well, fish. What makes this
# script slightly different is the fact that the player doesn't have to return ALL the fish in one trip. Instead
# this script uses a counter, that will add into a flag the number of fish the player returns on each trip.
#
# Once the player has brought back all the necessary fish the script will complete and can be repeated when the flag expires
# based on the time-out you've set.
#
# One extra little feature is that the script uses a 'listener' to see if the player did in fact catch the fish them self.
# If they didn't catch all the fish, then during the reward stage they will be paid less based on the amount you
# specify in the 'FishCheatRewardQty' constant value.
#
# NOTE: The dialogue is based on a female NPC.
#
# Tip: Place the NPC next to a lake/pond, build a chair, look at the chair and type '/npc sit -c'. Then look at where you
# want the NPC to cast their rod and type '/npc fish -c'. You toggle /npc lookclose' on and off to get them to face
# in the right direction.
#
# @author mythanical
# @script version 0.8.4
# @last-updated 12 January 2014
# @irc EsperNet IRC Network #denizen-dev
# @Minecraft Server - minecraft.geek.nz
"Fisherman":
type: assignment
default constants:
# Number of fish needed for the quest
FishQty: 1
# Money Reward Qty
FishingRewardQty: 600
# Reward amount if player cheated by not catching all the fish themselves.
FishCheatRewardQty: 300
# The time in between each repeat of the quest (currently set at 24 hours)
# Just replace the 'h' with 'm' for minutes, 's' for seconds etc.
Fishing Quest Repeat Timeout: 24h
interact scripts:
- 10 Catching Fish
actions:
on assignment:
# These triggers enable interaction with an NPC via chatting, clicking and entering proximity.
- trigger name:chat toggle:true
- trigger name:click toggle:true
- trigger name:proximity toggle:true
# The NPC will equip a fishing rod.
- equip i@fishing_rod
"Catching Fish":
type: interact
steps:
1:
proximity trigger:
entry:
script:
# On player entering NPC proximity range, run a script.
# The default proximity range is set in Denizen\config.yml
- ^run "Fisherman Greeting Requirements"
click trigger:
script:
# On clicking, run a slightly different script to check some requirements to see what dialog
# the player should be presented with.
- ^run "Fisherman Quest Requirement Check"
2:
chat trigger:
'Start Questline':
Trigger: /Yes/, I<&sq>ll go catch some fish for you!
script:
# If the player answer 'yes', this will set the quest flag to started and also start 'listening' for the player
# catching fish. Once the player caught the number of fish specified in the constant (FishQty) at the top of the script,
# it will run the 'Finished Fishing' script.
- flag <player> Fishing:Started
- ^listen item "id:Fishing Listener" type:fish qty:<npc.constant[FishQty]> "script:Fishing Completion Reminder"
- ^random {
- chat "<yellow>Aww thank you, you<&sq>re so sweet! Please bring me <red><npc.constant[FishQty]><yellow> fish."
- chat "<yellow>Yay! Thank you <white><player.name><yellow>! Please bring me <red><npc.constant[FishQty]><yellow> fish."
- chat "<yellow>Wonderful! Please bring me <red><npc.constant[FishQty]><yellow> fish." }
- narrate "<red> Fisherman - Quest Started"
- ^zap step:1
'Deny Questline':
Trigger: /No/, I can<&sq>t be bothered with petty tasks like fishing. I<&sq>ve got monsters to slay!
script:
# If the player says 'no', then display one of the following 3 messages and put them back at Step 1 for
# the 'Catching Fish' script.
- random {
- chat "<yellow>Oh.. ok then. I really thought you could.. oh nevermind."
- chat "<yellow>Oh that is grea.. oh wait, you said <&sq>No<&sq>. I<&sq>ll be ok, I think."
- chat "<yellow>Nevermind me, who am I anyway? You<&sq>ve got more important things to worry about." }
- random {
- narrate "<white><npc.name><red> starts crying softly."
- narrate "<red>Tears start rolling down <aqua><npc.name><&sq>s <red>face."
- narrate "<red>You hear quiet whimpering as you walk away from <aqua><npc.name><red>." }
- ^zap step:1
'What Did You Say':
trigger: /REGEX:\w+/
# This is a catch-all trigger that will repeat what the player said if what they
# typed didn't match any of the chat triggers above.
script:
- chat "<yellow>Sorry <white><player.name><yellow>, but I don<&sq>t what <&sq><white><context.message><yellow><&sq> means."
- ^narrate "<red>Say<&co>"
- ^narrate " <blue>Yes<blue> <gray>or<red> No"
proximity trigger:
exit:
script:
# If they exit the proximity trigger for the NPC, put them back at Step 1 so they get presented with the
# relevant options when they come back later.
- ^zap step:1
click trigger:
script:
# This is simply to present the options again if the player accidently clicks the NPC rather than type a response.
- ^run "Fisherman Quest Requirement Check"
"Fisherman Greeting Requirements":
type: task
speed: 0
script:
# The following options exist here
# 1) If the value against the flag 'Fish' is 'Started', then ask user how the fishing is going.
# 2) Else if the player has already done the quest and the timeout hasn't expired yet, simply chat something.
# 3) Otherwise if no criteria is met, simply run the script called 'Fisherman General Chat'.
- if <player.flag[Fishing]> == Started chat "<yellow>How is that fishing going?"
else if <player.flag[Fishing]> == Claimed chat "<yellow>Thanks again for your help <yellow><player.name><yellow>!"
else {
- random {
- chat "<yellow>Oh no no no, how am I going to get enough fish to the market in time?"
- chat "<yellow>Why can<&sq>t people eat something else for a while? I can<&sq>t keep up with the demand."
- chat "<yellow>Come on fishies! Take a bite!"
- chat "<yellow>Oh that was a big one.. now, to make it bite."
- chat "<yellow>That<&sq>s right fishies, grab onto that hook. You<&sq>ll be off to the market soon."
- chat "<yellow>Stop hiding under that rock.. there is a nice juice worm on this hook waiting for you."
- chat "<yellow>Arrg.. slow morning. The fish won<&sq>t seem to bite. I need help!"
}
}
"Fisherman Quest Requirement Check":
type: task
script:
# The following options exist here:
# 1) If the 'FishQuestCounter' is more or equal to the amount of fish the NPC wants AND the quest has in fact been started, then
# give the player their reward by running the 'Fishing Reward' script.
# 2) Else if the quest is started and the player has some fish in their inventory, run the 'Fish Counter' script.
# 3) Else if the quest is started, but the player doesn't have at least one fish in their inventory then tell the player how much
# they have brought. It gets the value from the 'FishQuestCounter' flag or if that doesn't exist, simply use the word 'no'.
# 4) Else if the quest has been completed, tell them when to come back by using '.expiration' as part of the flag name. Displays like '20h 12m' for example.
# 5) Else if the player has never done the quest OR the quest timeout has expired, then present them the fishing quest.
- ^if <player.flag[FishQuestCounter]||0> >= <npc.constant[FishQty]> && <player.flag[Fishing]> == Started run "Fishing Reward"
else if <player.flag[Fishing]> == Started && <player.inventory.contains[raw_fish]> run "Fish Counter"
else if <player.flag[Fishing]> == Started chat "<yellow>You<&sq>ve brought me <white><player.flag[FishQuestCounter].asint || no><yellow> fish so far and I need <white><player.flag[FishCountLeft].asint || <npc.constant[FishQty]>><yellow> more before I<&sq>m off to the market!"
else if <player.flag[Fishing]> == Claimed chat "<yellow>Thanks for your help <white><player.name><yellow>, I<&sq>ve got enough fish for now. Please come back in <red><player.flag[Fishing].expiration.formatted><yellow> to help me again."
else run "Present Fishing Quest"
"Present Fishing Quest":
type: task
script:
# This part presents the player with the quest, giving them some details via random dialog options
# and then asks them to answer 'yes' or 'no' before 'zapping' to Step 2 in the script 'Catching Fish'
# where it's waiting for the player to type something.
- ^random {
- ^chat "<yellow>Hello there <white><player.name><yellow>! Can you please help me catch some fish for the market?"
- ^chat "<yellow>Oh hey <white><player.name><yellow>, they are waiting for more fish at the market and I don<&sq>t have enough time!"
- ^chat "<yellow>Fish fish fish... I can<&sq>t keep up with the demand. Can you help me please?"
- ^chat "<yellow>Oh no! Why don<&sq>t these fish bite? I<&sq>m running out of time! Please help me <white><player.name><yellow>."
- ^chat "<yellow>When I took up this job, I thought it was going to be relaxing. I just can<&sq>t keep up. Help me?" }
- random {
- ^chat "<yellow>I will pay you <gold><npc.constant[FishingRewardQty]><yellow> <player.money.currency> if you catch <gray><npc.constant[FishQty]><yellow> fresh fish for me."
- ^chat "<yellow>How does <gold><npc.constant[FishingRewardQty]><yellow> <player.money.currency> for catching <gray><npc.constant[FishQty]><yellow> fresh fish sound to you?"
- ^chat "<yellow>The reward for catching <gray><npc.constant[FishQty]><yellow> fresh fish is <gold><npc.constant[FishingRewardQty]><yellow> <player.money.currency>. Interested?" }
- ^narrate "<red>Say<&co>"
- ^narrate " <blue>Yes<blue> <gray>or<red> No"
- ^zap step:2 "s@Catching Fish"
"Fishing Completion Reminder":
type: task
speed: 0
script:
# If the listener runs because the player caught enough fish, tell them to return to the NPC and set a flag to prove they did infact
# catch all the fish themself. This flag is used later to determine how much the player should be rewarded.
- ^narrate "<red>You should have caught enough fish by now to complete the <white>Fishing<red> Quest, that<&sq>s if you didn<&sq>t let any go. Return to <white><npc.name><red> for your reward."
- ^flag <player> PlayerCaughtAllFish
"Fish Counter":
type: task
script:
# The reason I use a 'count' script is so that the player has freedom in how much fish they bring back in each instance. So
# they can bring back 1 at a time, or 5 at a time. It doesn't require the player to have ALL the fish in their inventory for
# the script to progress.
# ---------------------------------------------------------------------------------------------------------------------------
# Count how much fish the player has in their inventory and put that value inside a flag called 'FishTempCount'
- ^flag <player> FishTempCount:<player.inventory.qty[raw_fish]>
# Then check if 'FishCountLeft' flag exists, if not create the flag and assign the 'FishQty' constant value to the flag.
- ^if <player.flag[FishCountLeft]||0> == 0 flag <player> FishCountLeft:<npc.constant[FishQty]>
# A quick IF statement then checks to see if the player has more fish in their inventory than what the NPC needs. If so, only take
# however much is still needed. If they have less than what is needed, only take the quantity they have in their inventory.
- ^if <player.inventory.qty[raw_fish]> >= <player.flag[FishCountLeft]> take i@raw_fish qty:<player.flag[FishCountLeft]>
else take i@raw_fish qty:<player.flag[FishTempCount]>
# Then subtract the fish count for this particular trip from the total remaining fish the NPC wants.
- ^flag <player> FishCountLeft:-:<player.flag[FishTempCount]>
# This flag does the opposite by instead storing the total count of fish that has been returned to the NPC. This provides
# flexibility in dialog by being able to say how much the player has brought back or how much they still need to bring back.
- ^flag <player> FishQuestCounter:+:<player.flag[FishTempCount]>
# Now clear the flag for this trip, preparing it for the next time the player could return for a few fish.
- ^flag <player> FishTempCount:!
# If the player hasn't returned all the fish needed yet, tell them how much they've brought and how much they still need to bring.
- ^if <player.flag[FishQuestCounter]> < <npc.constant[FishQty]> narrate "<red>You have brought <white><npc.name><red> a total of <gold><player.flag[FishQuestCounter].asint><red> fish, with <gold><player.flag[FishCountLeft].asint><red> remaining."
else run "Fisherman Quest Requirement Check"
"Fishing Reward":
type: task
script:
# The flag is set with a 'duration' of when it will expire and it determines when from the constant value called 'Fishing Quest Repeat Timeout' set
# at the top of this script.
- ^flag <player> Fishing:Claimed "duration:<npc.constant[Fishing Quest Repeat Timeout]>"
- ^random {
- ^chat "<yellow>You are a life saver <white><player.name><yellow>! You should come back later to help me again, if you can of course."
- ^chat "<yellow>I can<&sq>t believe it <white><player.name><yellow>, I can fill my quota at the market today. Thank you!"
- ^chat "<yellow>You<&sq>re my hero <white><player.name><yellow>. Please come help me again later and I<&sq>ll reward you." }
# This IF statement checks to see if the 'PlayerCaughtAllFish' flag is true (so if the fishing 'listener' ran when the player caught their
# fishing quantity) and reward them the full amount. Otherwise, only reward them with the amount set in the 'FishCheatRewardQty' constant value.
- ^if <player.flag[PlayerCaughtAllFish]> give money qty:<npc.constant[FishingRewardQty]>
- ^if <player.flag[Playerchoppedalllogs]> - execute as_server "addxp <player.name> fishing <context.message.mul[100].as_int>"
else give money qty:<npc.constant[FishCheatRewardQty]>
# The same if statement to decide which narrate the player gets depending on the 'PlayerCaughtAllFish' flag value.
- ^if <player.flag[PlayerCaughtAllFish]> narrate "<red>You are rewarded 5 fishing levels <gold><npc.constant[FishingRewardQty]><red> <player.money.currency> for bringing <white><npc.name><red> fresh fish you caught yourself."
else narrate "<red>You are only rewarded <gold><npc.constant[FishCheatRewardQty]><red> <player.money.currency> for bringing <white><npc.name><red> old fish you didn<&sq>t catch as part of this quest."
# Run the script to reset all the relevant flags.
- ^run "Reset Fishing Flags"
- wait 2
- narrate "<red> Fisherman - Quest Completed"
"Reset Fishing Flags":
type: task
script:
# Clean-up all flags (except for 'Fishing') and reset listener so quest is ready again when the 'Claimed' value on flag 'Fishing' expires.
- ^flag <player> PlayerCaughtAllFish:!
- ^flag <player> FishQuestCounter:!
- ^flag <player> FishTempCount:!
- ^flag <player> FishCountLeft:!
- ^listen cancel "id:Fishing Listener"