Housekeeping

This commit is contained in:
KeepBotting
2019-03-26 14:05:40 -04:00
parent a0c78ced90
commit 739c331860
135 changed files with 4 additions and 4 deletions
@@ -0,0 +1,89 @@
# Generic npcs
spawn_npc name: :man, x: 3276, y: 3186
spawn_npc name: :man, x: 3282, y: 3197
spawn_npc name: :man_3, x: 3301, y: 3200
spawn_npc name: :man_3, x: 3300, y: 3208
spawn_npc name: :man_2, x: 3297, y: 3196
spawn_npc name: :man_16, x: 3294, y: 3204
spawn_npc name: :spider_61, x: 3319, y: 3145
spawn_npc name: :spider_61, x: 3319, y: 3140
spawn_npc name: :spider_61, x: 3323, y: 3138
spawn_npc name: :scorpion, x: 3282, y: 3149
# Camels
spawn_npc name: :cam_the_camel, x: 3295, y: 3232
spawn_npc name: :elly_the_camel, x: 3312, y: 3210
spawn_npc name: :camel, x: 3285, y: 3198
spawn_npc name: :ollie_the_camel, x: 3291, y: 3209
spawn_npc name: :al_the_camel, x: 3275, y: 3162
# Quest npc
spawn_npc name: :osman, x: 3286, y: 3180, face: :east
spawn_npc name: :hassan, x: 3302, y: 3163
spawn_npc name: :father_reen, x: 3272, y: 3158
spawn_npc name: :man_663, x: 3297, y: 3287
# Boarder guards
spawn_npc name: 'border_guard', x: 3268, y: 3226, face: :north
spawn_npc name: 'border_guard', x: 3267, y: 3226, face: :north
spawn_npc name: 'border_guard', x: 3268, y: 3229, face: :south
spawn_npc name: 'border_guard', x: 3267, y: 3229, face: :south
# Palace guards
spawn_npc name: 'Al-Kharid warrior', x: 3285, y: 3174
spawn_npc name: 'Al-Kharid warrior', x: 3283, y: 3168
spawn_npc name: 'Al-Kharid warrior', x: 3285, y: 3169
spawn_npc name: 'Al-Kharid warrior', x: 3290, y: 3162
spawn_npc name: 'Al-Kharid warrior', x: 3295, y: 3162
spawn_npc name: 'Al-Kharid warrior', x: 3295, y: 3170
spawn_npc name: 'Al-Kharid warrior', x: 3300, y: 3175
spawn_npc name: 'Al-Kharid warrior', x: 3300, y: 3171
spawn_npc name: 'Al-Kharid warrior', x: 3301, y: 3168
# Shanty pass
spawn_npc name: :shantay_guard, x: 3301, y: 3120
spawn_npc name: :shantay_guard, x: 3302, y: 3126
spawn_npc name: :shantay_guard, x: 3306, y: 3126
spawn_npc name: :shantay_guard_838, x: 3303, y: 3118, face: :north
# Mine
spawn_npc name: :scorpion, x: 3296, y: 3294
spawn_npc name: :scorpion, x: 3298, y: 3280
spawn_npc name: :scorpion, x: 3299, y: 3299
spawn_npc name: :scorpion, x: 3299, y: 3309
spawn_npc name: :scorpion, x: 3300, y: 3287
spawn_npc name: :scorpion, x: 3300, y: 3315
spawn_npc name: :scorpion, x: 3301, y: 3305
spawn_npc name: :scorpion, x: 3301, y: 3312
# Functional npcs
spawn_npc name: :gnome_pilot, x: 3279, y: 3213
spawn_npc name: :banker_496, x: 3267, y: 3164, face: :east
spawn_npc name: :banker_497, x: 3267, y: 3166, face: :east
spawn_npc name: :banker_496, x: 3267, y: 3167, face: :east
spawn_npc name: :banker_497, x: 3267, y: 3168, face: :east
spawn_npc name: :banker_496, x: 3267, y: 3169, face: :east
spawn_npc name: :gem_trader, x: 3287, y: 3210
spawn_npc name: :zeke, x: 3289, y: 3189
spawn_npc name: :shantay, x: 3304, y: 3124
spawn_npc name: :rug_merchant_2296, x: 3311, y: 3109, face: :west
spawn_npc name: :ranael, x: 3315, y: 3163, face: :north
spawn_npc name: :shop_assistant_525, x: 3315, y: 3178, face: :north
spawn_npc name: :shop_keeper_524, x: 3315, y: 3180, face: :west
spawn_npc name: :louie_legs, x: 3316, y: 3175, face: :west
spawn_npc name: :ellis, x: 3274, y: 3192
spawn_npc name: :dommik, x: 3321, y: 3193
spawn_npc name: :tool_leprechaun, x: 3319, y: 3204
spawn_npc name: :ali_morrisane, x: 3304, y: 3211, face: :east
spawn_npc name: :silk_trader, x: 3300, y: 3203
spawn_npc name: :karim, x: 3273, y: 3180
@@ -0,0 +1,16 @@
<?xml version="1.0"?>
<plugin>
<id>location-al-kharid</id>
<version>0.1</version>
<name>Al-Kharid</name>
<description>Adds functionality to Al-Kharid.</description>
<authors>
<author>Major</author>
</authors>
<scripts>
<script>npcs.rb</script>
</scripts>
<dependencies>
<dependency>entity-spawning</dependency>
</dependencies>
</plugin>
@@ -0,0 +1,45 @@
# Generic npcs
spawn_npc name: :man, x: 3095, y: 3508
spawn_npc name: :man, x: 3095, y: 3511
spawn_npc name: :man, x: 3098, y: 3509
spawn_npc name: :man_2, x: 3093, y: 3511
spawn_npc name: :man_3, x: 3097, y: 3508
spawn_npc name: :man_3, x: 3092, y: 3508
spawn_npc name: :man_3, x: 3097, y: 3512
spawn_npc name: :guard, x: 3086, y: 3516
spawn_npc name: :guard, x: 3094, y: 3518
spawn_npc name: :guard, x: 3108, y: 3514
spawn_npc name: :guard, x: 3110, y: 3514
spawn_npc name: :guard, x: 3113, y: 3514
spawn_npc name: :guard, x: 3113, y: 3516
spawn_npc name: :sheep_43, x: 3050, y: 3516
spawn_npc name: :sheep_43, x: 3051, y: 3514
spawn_npc name: :sheep_43, x: 3056, y: 3517
spawn_npc name: :ram_3673, x: 3048, y: 3515
spawn_npc name: :monk, x: 3044, y: 3491
spawn_npc name: :monk, x: 3045, y: 3483
spawn_npc name: :monk, x: 3045, y: 3497
spawn_npc name: :monk, x: 3050, y: 3490
spawn_npc name: :monk, x: 3054, y: 3490
spawn_npc name: :monk, x: 3058, y: 3497
# Functional npcs
spawn_npc name: :richard, x: 3098, y: 3516
spawn_npc name: :doris, x: 3079, y: 3491
spawn_npc name: :brother_jered, x: 3045, y: 3488
spawn_npc name: :brother_althric, x: 3054, y: 3504
spawn_npc name: :abbot_langley, x: 3059, y: 3484
spawn_npc name: :oziach, x: 3067, y: 3518, face: :east
spawn_npc name: :shop_keeper_528, x: 3079, y: 3509
spawn_npc name: :shop_assistant_529, x: 3082, y: 3513
spawn_npc name: :banker, x: 3096, y: 3489, face: :west
spawn_npc name: :banker_495, x: 3096, y: 3491, face: :west
spawn_npc name: :banker_495, x: 3096, y: 3492, face: :north
spawn_npc name: :banker, x: 3098, y: 3492, face: :north
spawn_npc name: :mage_of_zamorak, x: 3106, y: 3560
@@ -0,0 +1,17 @@
<?xml version="1.0"?>
<plugin>
<id>location-edgeville</id>
<version>0.1</version>
<name>Edgeville</name>
<description>Adds functionality to Edgeville.</description>
<authors>
<author>xEliqa</author>
<author>Major</author>
</authors>
<scripts>
<script>npcs.rb</script>
</scripts>
<dependencies>
<dependency>entity-spawning</dependency>
</dependencies>
</plugin>
+157
View File
@@ -0,0 +1,157 @@
# Generic npcs
spawn_npc name: :chicken, x: 2965, y: 3345
spawn_npc name: :duck, x: 2988, y: 3383
spawn_npc name: :duck, x: 2992, y: 3383
spawn_npc name: :duck, x: 2993, y: 3385
spawn_npc name: :drunken_man, x: 2957, y: 3368, z: 1
spawn_npc name: :dwarf_118, x: 3023, y: 3334
spawn_npc name: :dwarf_118, x: 3027, y: 3341
spawn_npc name: :dwarf_118, x: 3012, y: 3341
spawn_npc name: :dwarf_118, x: 3017, y: 3346, z: 1
spawn_npc name: :dwarf_118, x: 3011, y: 3341, z: 1
spawn_npc name: :dwarf_121, x: 3027, y: 3341
spawn_npc name: :dwarf_382, x: 3017, y: 3340
spawn_npc name: :dwarf_3294, x: 3022, y: 3338
spawn_npc name: :dwarf_3295, x: 3021, y: 3341
spawn_npc name: :gardener, x: 2998, y: 3385
spawn_npc name: :gardener, x: 3019, y: 3369
spawn_npc name: :gardener_3234, x: 3016, y: 3386
spawn_npc name: :guard, x: 2965, y: 3394
spawn_npc name: :guard, x: 2964, y: 3396
spawn_npc name: :guard, x: 2966, y: 3397
spawn_npc name: :guard, x: 2964, y: 3384
spawn_npc name: :guard, x: 2963, y: 3380
spawn_npc name: :guard, x: 3006, y: 3325
spawn_npc name: :guard, x: 3008, y: 3320
spawn_npc name: :guard, x: 3006, y: 3322
spawn_npc name: :guard, x: 3038, y: 3356
spawn_npc name: :guard_10, x: 2942, y: 3375
spawn_npc name: :guard_10, x: 3040, y: 3352
spawn_npc name: :guard_3230, x: 2967, y: 3395
spawn_npc name: :guard_3230, x: 2966, y: 3392
spawn_npc name: :guard_3230, x: 2963, y: 3376
spawn_npc name: :guard_3230, x: 2954, y: 3382
spawn_npc name: :guard_3231, x: 2950, y: 3377
spawn_npc name: :guard_3231, x: 2968, y: 3381
spawn_npc name: :guard_3231, x: 3033, y: 3389, z: 1
spawn_npc name: :guard_3231, x: 3041, y: 3388, z: 1
spawn_npc name: :guard_3231, x: 3048, y: 3389, z: 1
spawn_npc name: :guard_3231, x: 3056, y: 3389, z: 1
spawn_npc name: :guard_3231, x: 3062, y: 3386, z: 1
spawn_npc name: :guard_3231, x: 3058, y: 3329, z: 1
spawn_npc name: :guard_3231, x: 3050, y: 3329, z: 1
spawn_npc name: :guard_3231, x: 3038, y: 3329, z: 1
spawn_npc name: :guard_3231, x: 3029, y: 3329, z: 1
spawn_npc name: :swan, x: 2960, y: 3359
spawn_npc name: :swan, x: 2963, y: 3360
spawn_npc name: :swan, x: 2968, y: 3359
spawn_npc name: :swan, x: 2971, y: 3360
spawn_npc name: :swan, x: 2976, y: 3358
spawn_npc name: :swan, x: 2989, y: 3384
spawn_npc name: :man_3223, x: 2991, y: 3365
spawn_npc name: :man_3225, x: 3037, y: 3345, z: 1
spawn_npc name: :white_knight, x: 2983, y: 3343
spawn_npc name: :white_knight, x: 2981, y: 3334
spawn_npc name: :white_knight, x: 2988, y: 3335
spawn_npc name: :white_knight, x: 2996, y: 3342
spawn_npc name: :white_knight, x: 2960, y: 3340
spawn_npc name: :white_knight, x: 2962, y: 3336
spawn_npc name: :white_knight, x: 2974, y: 3342
spawn_npc name: :white_knight, x: 2972, y: 3345
spawn_npc name: :white_knight, x: 2977, y: 3348
spawn_npc name: :white_knight_3348, x: 2971, y: 3340
spawn_npc name: :white_knight_3348, x: 2978, y: 3350
spawn_npc name: :white_knight, x: 2964, y: 3330, z: 1
spawn_npc name: :white_knight, x: 2968, y: 3334, z: 1
spawn_npc name: :white_knight, x: 2969, y: 3339, z: 1
spawn_npc name: :white_knight, x: 2978, y: 3332, z: 1
spawn_npc name: :white_knight, x: 2958, y: 3340, z: 1
spawn_npc name: :white_knight, x: 2960, y: 3343, z: 1
spawn_npc name: :white_knight_3348, x: 2987, y: 3334, z: 1
spawn_npc name: :white_knight_3348, x: 2983, y: 3336, z: 1
spawn_npc name: :white_knight_3348, x: 2987, y: 3334, z: 1
spawn_npc name: :white_knight_3348, x: 2979, y: 3348, z: 1
spawn_npc name: :white_knight_3348, x: 2964, y: 3337, z: 1
spawn_npc name: :white_knight_3349, x: 2989, y: 3344, z: 1
spawn_npc name: :white_knight, x: 2985, y: 3342, z: 2
spawn_npc name: :white_knight_3348, x: 2979, y: 3348, z: 2
spawn_npc name: :white_knight_3348, x: 2974, y: 3329, z: 2
spawn_npc name: :white_knight_3348, x: 2982, y: 3341, z: 2
spawn_npc name: :white_knight_3349, x: 2990, y: 3341, z: 2
spawn_npc name: :white_knight_3349, x: 2971, y: 3330, z: 2
spawn_npc name: :white_knight_3349, x: 2965, y: 3350, z: 2
spawn_npc name: :white_knight_3349, x: 2965, y: 3329, z: 2
spawn_npc name: :white_knight_3350, x: 2961, y: 3347, z: 2
spawn_npc name: :white_knight_3349, x: 2962, y: 3339, z: 3
spawn_npc name: :white_knight_3350, x: 2960, y: 3336, z: 3
spawn_npc name: :white_knight_3350, x: 2984, y: 3349, z: 3
spawn_npc name: :woman_3226, x: 2991, y: 3384
# Functional npcs
spawn_npc name: :apprentice_workman_3235, x: 2971, y: 3369, z: 1
spawn_npc name: :banker_495, x: 2945, y: 3366, face: :north
spawn_npc name: :banker_495, x: 2946, y: 3366, face: :north
spawn_npc name: :banker_495, x: 2947, y: 3366, face: :north
spawn_npc name: :banker_495, x: 2948, y: 3366, face: :north
spawn_npc name: :banker, x: 2949, y: 3366, face: :north
spawn_npc name: :banker, x: 3015, y: 3353, face: :north
spawn_npc name: :banker, x: 3014, y: 3353, face: :north
spawn_npc name: :banker, x: 3013, y: 3353, face: :north
spawn_npc name: :banker, x: 3012, y: 3353, face: :north
spawn_npc name: :banker, x: 3011, y: 3353, face: :north
spawn_npc name: :banker, x: 3010, y: 3353, face: :north
spawn_npc name: :cassie, x: 2976, y: 3383
spawn_npc name: :emily, x: 2954, y: 3372
spawn_npc name: :flynn, x: 2950, y: 3387
spawn_npc name: :hairdresser, x: 2944, y: 3380
spawn_npc name: :herquin, x: 2945, y: 3335
spawn_npc name: :heskel, x: 3007, y: 3374
spawn_npc name: :kaylee, x: 2957, y: 3372
spawn_npc name: :tina, x: 2955, y: 3371, z: 1
spawn_npc name: :tool_leprechaun, x: 3005, y: 3370
spawn_npc name: :squire, x: 2977, y: 3343
spawn_npc name: :sir_tiffy_cashien, x: 2997, y: 3373, face: :north
spawn_npc name: :sir_amik_varze, x: 2960, y: 3336, z: 2
spawn_npc name: :sir_vyvin, x: 2983, y: 3335, z: 2
spawn_npc name: :shop_asssistant_525, x: 2955, y: 3389
spawn_npc name: :shop_keeper_524, x: 2957, y: 3387
spawn_npc name: :wayne, x: 2972, y: 3312
spawn_npc name: :workman_3236, x: 2975, y: 3369, z: 1
spawn_npc name: :wyson_the_gardener, x: 3028, y: 3381
@@ -0,0 +1,16 @@
<?xml version="1.0"?>
<plugin>
<id>location-falador</id>
<version>0.1</version>
<name>Falador</name>
<description>Adds functionality to Falador.</description>
<authors>
<author>Wizard Jesse</author>
</authors>
<scripts>
<script>npcs.rb</script>
</scripts>
<dependencies>
<dependency>entity-spawning</dependency>
</dependencies>
</plugin>
@@ -0,0 +1,16 @@
# Generic npcs
spawn_npc name: :woman_4, x: 3232, y: 3207 # southernmost house
spawn_npc name: :man_1, x: 3231, y: 3237 # house by willow tree
spawn_npc name: :man_2, x: 3224, y: 3240 # house by willow tree
spawn_npc name: :woman_5, x: 3229, y: 2329 # house by willow tree
# Functional npcs
spawn_npc name: :hans, x: 3221, y: 3221
spawn_npc name: :father_aereck, x: 3243, y: 3210
spawn_npc name: :bob, x: 3231, y: 3203
spawn_npc name: :shop_keeper, x: 3212, y: 3247
spawn_npc name: :shop_assistant, x: 3211, y: 3245
spawn_npc name: :lumbridge_guide, x: 3232, y: 3229
@@ -0,0 +1,16 @@
<?xml version="1.0"?>
<plugin>
<id>location-lumbridge</id>
<version>0.1</version>
<name>Lumbridge</name>
<description>Adds functionality to Lumbridge.</description>
<authors>
<author>Major</author>
</authors>
<scripts>
<script>npcs.rb</script>
</scripts>
<dependencies>
<dependency>entity-spawning</dependency>
</dependencies>
</plugin>
@@ -0,0 +1,158 @@
require 'java'
java_import 'org.apollo.game.message.impl.HintIconMessage'
java_import 'org.apollo.game.message.impl.MobHintIconMessage'
java_import 'org.apollo.game.message.impl.PositionHintIconMessage'
java_import 'org.apollo.game.message.impl.SwitchTabInterfaceMessage'
java_import 'org.apollo.game.model.entity.EntityType'
java_import 'org.apollo.game.model.Position'
private
# Contains constants used during the Runescape Guide part of Tutorial Island.
module GuideConstants
# The Runescape Guide Npc.
RUNESCAPE_GUIDE = spawn_npc name: :runescape_guide, x: 3093, y: 3107
# The character design interface id.
CHARACTER_DESIGN_INTERFACE = 3559
# The id of the door of the house new players spawn in.
DOOR_ID = 3014
# The Position of the door of the house new players spawn in.
DOOR_POSITION = Position.new(3098, 3107)
# The HintIconMessage sent to display a hint arrow above the door of the house new players spawn
# in.
DOOR_HINT = PositionHintIconMessage.new(HintIconMessage::Type::WEST, DOOR_POSITION, 120)
# The ids of tabs that are displayed when the player has yet to start the tutorial.
INITIAL_TABS = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2449, 904, -1, -1].freeze
# The HintIconMessage sent to remove a hint arrow from above the door.
RESET_DOOR_HINT = PositionHintIconMessage.reset
# The HintIconMessage sent to remove a hint arrow from an Npc.
RESET_NPC_HINT = MobHintIconMessage.reset(EntityType::NPC)
end
# Sends the appropriate data to the client when the player logs in to the game.
on :login do |_event, player|
if player.in_tutorial_island && player.privilege_level != RIGHTS_ADMIN
TutorialInstructions.show_instruction(player)
GuideConstants::INITIAL_TABS.each_with_index do |tab, index|
player.send(SwitchTabInterfaceMessage.new(index, tab))
end
if player.tutorial_island_progress == :not_started
player.interface_set.open_window(GuideConstants::CHARACTER_DESIGN_INTERFACE)
player.send(MobHintIconMessage.create(GuideConstants::RUNESCAPE_GUIDE))
end
end
end
# The conversation with the Runescape Guide, when on tutorial island.
conversation :tutorial_runescape_guide do
# The first dialogue of the Runescape Guide, greeting the Player.
dialogue :greetings do
type :npc_speech
npc :runescape_guide
emote :calm
precondition { |player| player.tutorial_island_progress == :not_started }
text 'Greetings! I see you are a new arrival to this land. My job is to welcome all new '\
'visitors. So welcome!'
continue dialogue: :talk_to_people do |player|
player.tutorial_island_progress = :talk_to_people
end
end
# The Guide welcomes back the Player if they speak to him after they have already gone through
# the conversation once.
dialogue :welcome_back do
type :npc_speech
npc :runescape_guide
emote :calm
precondition { |player| player.tutorial_island_progress != :not_started }
text 'Welcome back.'
continue dialogue: :talk_to_people
end
# The Guide tells Players to speak to people in order to succeed.
dialogue :talk_to_people do
type :npc_speech
npc :runescape_guide
emote :calm
text 'You have already learned the first thing you need to succeed in this world: talking to '\
'people!',
'You will find many inhabitants of this world have useful things to say to you. By '\
'clicking on them with your mouse you can talk to them.',
'I would also suggest reading through some of the supporting information on the website.'\
' There you can find maps, a bestiary, and much more.'
continue dialogue: :go_through_door
end
# The Guide tells Players to go through the door, advancing the tutorial progress if this is the
# first time the Player has heard this.
dialogue :go_through_door do
type :npc_speech
npc :runescape_guide
emote :calm
text 'To continue the tutorial go through that door over there, and speak to your first '\
'instructor.'
close do |player|
if player.tutorial_island_progress < :runescape_guide_finished
player.send(GuideConstants::RESET_NPC_HINT)
player.send(GuideConstants::DOOR_HINT)
player.tutorial_island_progress = :runescape_guide_finished
end
TutorialInstructions.show_instruction(player)
end
end
# The dialogue displayed if the player attempts to leave the Runescape Guide's house before they
# have spoken to him.
dialogue :talk_to_guide do
type :text
text 'You need to talk to the Runescape Guide before you are allowed to proceed through this '\
'door.'
close do |player|
TutorialInstructions.show_instruction(player)
end
end
end
on :open_door do |event, player|
door = event.door
if player.in_tutorial_island && door.position.equals(GuideConstants::DOOR_POSITION)
if player.tutorial_island_progress < :runescape_guide_finished
send_dialogue(player, get_dialogue(:tutorial_runescape_guide, :talk_to_guide))
event.terminate
elsif player.tutorial_island_progress == :runescape_guide_finished
player.tutorial_island_progress = :moving_around
player.send(GuideConstants::RESET_DOOR_HINT)
TutorialInstructions.show_instruction(player)
end
end
end
@@ -0,0 +1,141 @@
# Contains members related to the instructions issues during tutorial island.
module TutorialInstructions
# Sends the appropriate instruction to the player.
def self.show_instruction(player)
instructions = CONVERSATIONS[:tutorial_island_instructions]
progress = player.tutorial_island_progress.name
name = case progress
# The Runescape Guide instructions.
when :not_started then :getting_started
when :runescape_guide_finished then :scenery
when :moving_around then :moving_around
# The Survival Guide instructions.
when :given_axe then :viewing_items
when :cut_tree then :cut_tree
when :cutting_tree then :please_wait
else raise "No dialogue for current stage #{progress} exists."
end
dialogue = instructions.part(name)
send_dialogue(player, dialogue)
end
# The one-sided 'conversation' of instruction instructions.
conversation :tutorial_island_instructions do
# The initial instruction displayed when the player logs in, before they have spoken to the
# guide.
dialogue :getting_started do
type :text
title 'Getting started'
text 'To start the tutorial, use your left mouse button to click on the Runescape Guide in '\
'this room. He is indicated by a flashing yellow arrow above his head. If you can\'t '\
'see him, use your keyboard\'s arrow keys to rotate the view.'
end
# The instruction displayed after the player has spoken to the Runescape Guide.
dialogue :scenery do
type :text
title 'Interacting with scenery'
text 'You can interact with many items of the scenery by simply clicking on them. Right '\
'clicking will also give more options. Click on the door indicated with the yellow '\
'arrow to go through to the next area and speak with your next instructor.'
end
# The instruction displayed after the player has left the initial building.
dialogue :moving_around do
type :text
title 'Moving around'
text 'Follow the path to find the next instructor. Clicking on the ground will walk you to '\
'that point. Talk to the survival expert by the pond to continue the tutorial. '\
'Remember you can rotate the view by pressing the arrow keys.'
end
# The instruction displayed after the player has been given the tinderbox and bronze axe by the
# Survival Guide.
dialogue :viewing_items do
type :text
title 'Viewing the items you were given'
text 'Click on the flashing backpack icon to the right side of the main window to view your '\
'inventory. Your inventory is a list of everything you have in your backpack.'
end
# The instruction displayed if the player tries to cut a tree before having the axe.
dialogue :try_cut_tree do
type :text
title 'Follow the guide\'s instructions'
text 'You cannot cut down this tree, you must first follow the guide\'s instructions.'
end
# The instruction displayed before the player has begun to cut the tree.
dialogue :cut_tree do
type :text
title 'Cut down a tree'
text 'You can click on the backpack icon at any time to view the items that you currently '\
'have in your inventory. You will see that you now have an axe in your inventory. '\
'Use this to get some logs by clicking on the indicated tree.'
end
# The instruction displayed when the player begins to cut the tree.
dialogue :please_wait do
type :text
title 'Please wait...'
text 'Your character is now attempting to cut down the tree. Sit back for a moment whilst '\
'he does all the hard work.' # TODO: she instead of he if applicable
end
# The instruction displayed after the player has successfully cut logs from the tree.
dialogue :make_a_fire do
type :text
title 'Making a fire'
text 'Well done! You managed to cut some logs from the tree! Next, use the tinderbox in '\
'your inventory to light the logs. First click on the tinderbox to \'use\' it.'\
'Then click on the logs in your inventory to light them.'
end
# The instruction displayed when the player begins to light the fire.
dialogue :lighting_fire do
type :text
title 'Please wait...'
# TODO: she instead of he if applicable
text 'Your character is now attempting to light the logs. Sit back for a moment whilst he '\
'does all the hard work.'
end
# The instruction displayed when the has lit the logs.
dialogue :gained_experience do
type :text
text 'You gained some experience.'\
'Click on the flashing bar graph icon near the inventory button to see your skill '\
'stats.'
end
# The dialogue displayed when the Player has clicked the flashing skill tab icon.
dialogue :skill_stats do
type :text
title 'Your skill stats.'
text 'Here you will see how good your skills are. As you move your mouse over any of the '\
'icons in this panel, the small yellow popup box will show you the exact amount of '\
'experience you have and how much is needed to get to the next level. Speak to the '\
'Survival Expert to continue.'
end
end
end
@@ -0,0 +1,40 @@
# Functional npcs
# 'Above-ground' npcs
spawn_npc name: :master_chef, x: 3076, y: 3085
spawn_npc name: :quest_guide, x: 3086, y: 3122, face: :north
spawn_npc name: :financial_advisor, x: 3127, y: 3124, face: :west
spawn_npc name: :brother_brace, x: 3124, y: 3107, face: :east
spawn_npc name: :magic_instructor, x: 3140, y: 3085
# 'Below-ground' npcs
# Note: They aren't actually on a different plane, they're just in a different location that
# pretends to be underground.
spawn_npc name: :mining_instructor, x: 3081, y: 9504
spawn_npc name: :combat_instructor, x: 3104, y: 9506
# Non-humanoid npcs
spawn_npc name: :fishing_spot_316, x: 3102, y: 3093
spawn_npc name: :chicken, x: 3140, y: 3095
spawn_npc name: :chicken, x: 3140, y: 3093
spawn_npc name: :chicken, x: 3138, y: 3092
spawn_npc name: :chicken, x: 3137, y: 3094
spawn_npc name: :chicken, x: 3138, y: 3095
# 'Below-ground' npcs
# Note: They aren't actually on a different plane, they're just in a different location that
# pretends to be underground.
spawn_npc name: :giant_rat_87, x: 3105, y: 9514
spawn_npc name: :giant_rat_87, x: 3105, y: 9517
spawn_npc name: :giant_rat_87, x: 3106, y: 9514
spawn_npc name: :giant_rat_87, x: 3104, y: 9514
spawn_npc name: :giant_rat_87, x: 3105, y: 9519
spawn_npc name: :giant_rat_87, x: 3109, y: 9516
spawn_npc name: :giant_rat_87, x: 3108, y: 9520
spawn_npc name: :giant_rat_87, x: 3102, y: 9517
@@ -0,0 +1,24 @@
<?xml version="1.0"?>
<plugin>
<id>location-tutorial-island</id>
<version>0.1</version>
<name>Tutorial Island</name>
<description>Adds functionality to Tutorial island.</description>
<authors>
<author>Major</author>
</authors>
<scripts>
<script>instructions.rb</script>
<script>guide.rb</script>
<script>npcs.rb</script>
<script>stages.rb</script>
<script>survival.rb</script>
<script>utils.rb</script>
</scripts>
<dependencies>
<dependency>dialogue</dependency>
<dependency>door</dependency>
<dependency>entity-spawning</dependency>
<dependency>quest</dependency>
</dependencies>
</plugin>
@@ -0,0 +1,16 @@
private
# The array of stages in tutorial island.
@stages = []
# The stages that are used when interacting with the Runescape Guide.
RUNESCAPE_GUIDE = [:not_started, :talk_to_people, :go_through_door, :runescape_guide_finished,
:moving_around].freeze
@stages.concat(RUNESCAPE_GUIDE)
# The stages that are used when interacting with the Survival Expert.
SURVIVAL_EXPERT = [:given_axe, :cut_tree, :cutting_tree].freeze
@stages.concat(SURVIVAL_EXPERT)
quest :tutorial_island, @stages
@@ -0,0 +1,154 @@
require 'java'
java_import 'org.apollo.game.message.impl.FlashTabInterfaceMessage'
java_import 'org.apollo.game.message.impl.FlashingTabClickedMessage'
java_import 'org.apollo.game.message.impl.SwitchTabInterfaceMessage'
private
# Contains Survival Expert-related constants.
module SurvivalConstants
# The Survival Expert Npc.
@survival_expert = spawn_npc name: :survival_expert, x: 3104, y: 3095, face: :north
# The inventory tab index.
INVENTORY_TAB_INDEX = 3
# The inventory tab id.
INVENTORY_TAB_ID = 3213
# The id of the tree the Player will cut down.
TREE_ID = 3033
# The id of the bronze axe.
BRONZE_AXE = lookup_item(:bronze_axe)
# The id of the tinderbox.
TINDERBOX = lookup_item(:tinderbox)
end
# The conversation with the Survival Expert, when on tutorial island.
conversation :tutorial_survival_expert do
dialogue :introduction do
type :npc_speech
npc :survival_expert
precondition { |player| player.tutorial_island_progress == :moving_around }
text 'Hello there, newcomer. My name is Brynna. My job is to teach you a few survival tips and'\
' tricks. First off we\'re going to start with the most basic survival skill of all: '\
'making a fire.'
close { |player| add_survival_items(player) }
end
dialogue :hello_again do
type :npc_speech
npc :survival_expert
precondition { |player| player.tutorial_island_progress == :moving_around }
text 'Hello again. I\'m here to teach you a few survival tips and tricks. First off we\'re '\
'going to start with the most basic survival skill of all: making a fire.'
close { |player| add_survival_items(player) }
end
# The dialogue displayed when the Survival Expert gives the player a bronze axe.
dialogue :give_bronze_axe do
type :message_with_item
item :bronze_axe
text 'The Survival Expert gives you a bronze axe!'
close { |player| TutorialInstructions.show_instruction(player) }
end
# The dialogue displayed when the Survival Expert gives the player a tinderbox.
dialogue :give_tinderbox do
type :message_with_item
item :tinderbox
text 'The Survival Expert gives you a tinderbox!'
close { |player| TutorialInstructions.show_instruction(player) }
end
# The dialogue displayed when the Survival Expert gives the player both a bronze axe and a
# tinderbox.
dialogue :give_axe_and_tinderbox do
type :message_with_item
item :bronze_axe
# TODO: the tinderbox is also displayed - find this dialogue id. Scale looks like the default
# http://i.imgur.com/i1abN5X.png
text 'The Survival Expert gives you a tinderbox and a bronze axe!'
close do |player|
if player.tutorial_island_progress < :given_axe
player.tutorial_island_progress = :given_axe
index = SurvivalConstants::INVENTORY_TAB_INDEX
player.send(SwitchTabInterfaceMessage.new(index, SurvivalConstants::INVENTORY_TAB_ID))
player.send(FlashTabInterfaceMessage.new(index))
end
TutorialInstructions.show_instruction(player)
end
end
# The dialogue displayed when the player has succesfully cut down a tree.
dialogue :get_logs do
type :message_with_item
item :logs
text 'You get some logs.'
close { |player| TutorialInstructions.show_instruction(player) }
end
end
# Add the survival items (bronze axe and tinderbox) to the inventory of the player, if they do not
# already have them.
def add_survival_items(player)
inventory = player.inventory
unless inventory.contains(SurvivalConstants::BRONZE_AXE)
inventory.add(SurvivalConstants::BRONZE_AXE)
dialogue = :give_bronze_axe
end
unless inventory.contains(SurvivalConstants::TINDERBOX)
inventory.add(SurvivalConstants::TINDERBOX)
dialogue = (dialogue == :give_bronze_axe) ? :give_axe_and_tinderbox : :give_tinderbox
end
send_dialogue(player, get_dialogue(:tutorial_survival_expert, dialogue))
end
# Intercept the FirstObjectActionMessage to send tutorial-only events if the player is chopping
# down a tree.
on :message, :first_object_action do |player, message|
if player.in_tutorial_island && message.id == SurvivalConstants::TREE_ID
progress = player.tutorial_island_progress
if progress < :cut_tree
send_dialogue(player, get_dialogue(:tutorial_island_instructions, :try_cut_tree))
elsif player.tutorial_island_progress == :cut_tree
# Don't break the chain, so that the Woodcutting event actually happens.
player.tutorial_island_progress = :cutting_tree
end
end
end
# Intercept the FlashingTabClickedMessage to update the player's progress, if applicable.
on :message, :flashing_tab_clicked do |player, message|
if player.in_tutorial_island && message.tab == SurvivalConstants::INVENTORY_TAB_INDEX &&
player.tutorial_island_progress == :given_axe
player.tutorial_island_progress = :cut_tree
message.terminate
end
end
@@ -0,0 +1,30 @@
require 'java'
java_import 'org.apollo.game.model.entity.Player'
# Declare the tutorial island progress attribute.
declare_attribute(:tutorial_island_progress, :not_started, :persistent)
# The existing player class.
class Player
# Returns whether or not this Player is currently on tutorial island.
def in_tutorial_island
x = position.x
y = position.y
above_ground(x, y) || below_ground(x, y)
end
end
private
# Returns whether or not the specified coordinate pair is above ground on tutorial island.
def above_ground(x, y)
x >= 3053 && x <= 3156 && y >= 3056 && y <= 3136
end
# Returns whether or not the specified coordinate pair is 'below' ground on tutorial island.
def below_ground(x, y)
x >= 3072 && x <= 3118 && y >= 9492 && y <= 9535
end
+258
View File
@@ -0,0 +1,258 @@
# Generic Npc
spawn_npc name: :barbarian_woman, x: 3222, y: 3399
spawn_npc name: :bear_106, x: 3289, y: 3351
spawn_npc name: :black_knight, x: 3238, y: 3514
spawn_npc name: :black_knight, x: 3227, y: 3518
spawn_npc name: :black_knight, x: 3279, y: 3502
spawn_npc name: :dark_wizard_174, x: 3230, y: 3366
spawn_npc name: :dark_wizard_174, x: 3228, y: 3368
spawn_npc name: :dark_wizard_174, x: 3225, y: 3367
spawn_npc name: :dark_wizard_174, x: 3226, y: 3365
spawn_npc name: :dark_wizard_174, x: 3226, y: 3372
spawn_npc name: :dark_wizard_174, x: 3231, y: 3371
spawn_npc name: :dark_wizard_172, x: 3229, y: 3372
spawn_npc name: :dark_wizard_172, x: 3224, y: 3370
spawn_npc name: :dark_wizard_172, x: 3228, y: 3366
spawn_npc name: :dark_wizard_172, x: 3232, y: 3368
spawn_npc name: :dark_wizard_172, x: 3226, y: 3369
spawn_npc name: :giant_rat_87, x: 3292, y: 3375
spawn_npc name: :giant_rat_87, x: 3265, y: 3384
spawn_npc name: :giant_rat_87, x: 3267, y: 3381
spawn_npc name: :guard_368, x: 3263, y: 3407, face: :south
spawn_npc name: :jeremy_clerksin, x: 3253, y: 3477
spawn_npc name: :martina_scorsby, x: 3256, y: 3481
spawn_npc name: :man, x: 3281, y: 3500
spawn_npc name: :man, x: 3193, y: 3394
spawn_npc name: :man, x: 3159, y: 3429
spawn_npc name: :man, x: 3245, y: 3394
spawn_npc name: :man, x: 3283, y: 3492, z: 1
spawn_npc name: :man_2, x: 3263, y: 3400
spawn_npc name: :man_3, x: 3227, y: 3395, z: 1
spawn_npc name: :man_3, x: 3231, y: 3399, z: 1
spawn_npc name: :mugger, x: 3251, y: 3390
spawn_npc name: :mugger, x: 3177, y: 3363
spawn_npc name: :tramp_2792, x: 3228, y: 3410
spawn_npc name: :woman, x: 3221, y: 3396
spawn_npc name: :woman_5, x: 3279, y: 3497
spawn_npc name: :woman_25, x: 3278, y: 3492
spawn_npc name: :thief, x: 3285, y: 3500
spawn_npc name: :thief, x: 3234, y: 3389
spawn_npc name: :thief, x: 3188, y: 3383
spawn_npc name: :thief, x: 3184, y: 3390
spawn_npc name: :thief, x: 3188, y: 3394
spawn_npc name: :unicorn, x: 3286, y: 3342
spawn_npc name: :unicorn, x: 3279, y: 3345
# North Guards
spawn_npc name: :guard, x: 3244, y: 3500
spawn_npc name: :guard, x: 3247, y: 3503
# East Guards
spawn_npc name: :guard, x: 3271, y: 3431
spawn_npc name: :guard, x: 3270, y: 3425
spawn_npc name: :guard, x: 3274, y: 3421
spawn_npc name: :guard, x: 3274, y: 3427
# South Guards
spawn_npc name: :guard, x: 3210, y: 3382
spawn_npc name: :guard, x: 3212, y: 3380
spawn_npc name: :guard, x: 3207, y: 3376
# West Guards
spawn_npc name: :guard, x: 3174, y: 3427
spawn_npc name: :guard, x: 3176, y: 3430
spawn_npc name: :guard, x: 3176, y: 3427
spawn_npc name: :guard, x: 3180, y: 3399
spawn_npc name: :guard, x: 3175, y: 3415, z: 1
spawn_npc name: :guard, x: 3174, y: 3403, z: 1
# Varrock Palace
spawn_npc name: :guard, x: 3210, y: 3461
spawn_npc name: :guard, x: 3211, y: 3465
spawn_npc name: :guard, x: 3214, y: 3462
spawn_npc name: :guard, x: 3216, y: 3464
spawn_npc name: :guard, x: 3220, y: 3461
spawn_npc name: :guard, x: 3206, y: 3461
spawn_npc name: :guard, x: 3204, y: 3495
spawn_npc name: :guard, x: 3204, y: 3495, z: 1
spawn_npc name: :guard, x: 3205, y: 3492, z: 1
spawn_npc name: :guard, x: 3203, y: 3492, z: 1
spawn_npc name: :guard, x: 3205, y: 3497, z: 1
spawn_npc name: :guard, x: 3221, y: 3471, z: 2
spawn_npc name: :guard, x: 3214, y: 3474, z: 2
spawn_npc name: :guard, x: 3215, y: 3471, z: 2
spawn_npc name: :guard, x: 3211, y: 3471, z: 2
spawn_npc name: :guard, x: 3209, y: 3473, z: 2
spawn_npc name: :guard, x: 3212, y: 3475, z: 2
spawn_npc name: :guard, x: 3207, y: 3477, z: 2
spawn_npc name: :guard, x: 3203, y: 3476, z: 2
spawn_npc name: :guard, x: 3205, y: 3479, z: 2
spawn_npc name: :guard, x: 3203, y: 3483, z: 2
spawn_npc name: :guard, x: 3221, y: 3485, z: 2
spawn_npc name: :monk_of_zamorak_189, x: 3213, y: 3476
spawn_npc name: :warrior_woman, x: 3203, y: 3490
spawn_npc name: :warrior_woman, x: 3205, y: 3493
# Varrock/Lumbridge Pen
spawn_npc name: :swan, x: 3261, y: 3354
spawn_npc name: :swan, x: 3260, y: 3356
spawn_npc name: :ram_3673, x: 3238, y: 3346
spawn_npc name: :ram_3673, x: 3248, y: 3352
spawn_npc name: :ram_3673, x: 3260, y: 3348
spawn_npc name: :sheep_42, x: 3263, y: 3347
spawn_npc name: :sheep_42, x: 3268, y: 3350
spawn_npc name: :sheep_42, x: 3252, y: 3352
spawn_npc name: :sheep_42, x: 3243, y: 3344
spawn_npc name: :sheep_42, x: 3235, y: 3347
spawn_npc name: :sheep_3579, x: 3234, y: 3344
spawn_npc name: :sheep_3579, x: 3241, y: 3347
spawn_npc name: :sheep_3579, x: 3257, y: 3350
# Champions Guild
spawn_npc name: :chicken, x: 3195, y: 3359
spawn_npc name: :chicken, x: 3198, y: 3356
spawn_npc name: :chicken, x: 3195, y: 3355
spawn_npc name: :chicken_1017, x: 3196, y: 3353
spawn_npc name: :chicken_1017, x: 3197, y: 3356
spawn_npc name: :evil_chicken, x: 3198, y: 3359
# Function Npc
spawn_npc name: :apothecary, x: 3196, y: 3403
spawn_npc name: :captain_rovin, x: 3204, y: 3496, z: 2
spawn_npc name: :curator, x: 3256, y: 3447
spawn_npc name: :dimintheis, x: 3280, y: 3403
spawn_npc name: :dr_harlow, x: 3224, y: 3398
spawn_npc name: :ellamaria, x: 3228, y: 3475
spawn_npc name: :father_lawrence, x: 3253, y: 3484
spawn_npc name: :guidors_wife_342, x: 3280, y: 3382
spawn_npc name: :guidor, x: 3284, y: 3381, face: :south
spawn_npc name: :guild_master, x: 3189, y: 3360
spawn_npc name: :gypsy, x: 3203, y: 3423
spawn_npc name: :hooknosed_jack, x: 3268, y: 3400
spawn_npc name: :jonny_the_beard, x: 3223, y: 3395
spawn_npc name: :johnathon, x: 3278, y: 3503, z: 1
spawn_npc name: :katrine, x: 3185, y: 3386
spawn_npc name: :king_roald, x: 3223, y: 3473
spawn_npc name: :master_farmer, x: 3243, y: 3349
spawn_npc name: :pox, x: 3267, y: 3399
spawn_npc name: :reldo, x: 3210, y: 3492
spawn_npc name: :romeo, x: 3211, y: 3423
spawn_npc name: :shilop, x: 3221, y: 3435
spawn_npc name: :sir_prysin, x: 3204, y: 3472
spawn_npc name: :tarquin, x: 3203, y: 3344, face: :south
spawn_npc name: :tool_leprechaun, x: 3182, y: 3355
spawn_npc name: :tool_leprechaun, x: 3229, y: 3455, face: :north
spawn_npc name: :tramp_641, x: 3207, y: 3392
spawn_npc name: :wilough, x: 3222, y: 3437
# Shop Npc
spawn_npc name: :aubury, x: 3253, y: 3401
spawn_npc name: :baraek, x: 3217, y: 3434
spawn_npc name: :bartender, x: 3226, y: 3400
spawn_npc name: :bartender_1921, x: 3277, y: 3487
spawn_npc name: :fancy_dress_shop_owner, x: 3281, y: 3398
spawn_npc name: :horvik, x: 3229, y: 3438
spawn_npc name: :lowe, x: 3233, y: 3421
spawn_npc name: :scavvo, x: 3192, y: 3353, z: 1
spawn_npc name: :shop_keeper_551, x: 3206, y: 3399
spawn_npc name: :shop_assistant_552, x: 3207, y: 3396
spawn_npc name: :shop_keeper_522, x: 3216, y: 3414
spawn_npc name: :shop_assistant_523, x: 3216, y: 3417
spawn_npc name: :tea_seller, x: 3271, y: 3411
spawn_npc name: :thessalia, x: 3206, y: 3417
spawn_npc name: :zaff, x: 3203, y: 3434
# Juliet House
spawn_npc name: :draul_leptoc, x: 3228, y: 3475
spawn_npc name: :juliet, x: 3159, y: 3425, z: 1
spawn_npc name: :phillipa, x: 3160, y: 3429, z: 1
# Gertrude House
spawn_npc name: :gertrude, x: 3153, y: 3413
spawn_npc name: :kanel, x: 3155, y: 3405, face: :east
spawn_npc name: :philop, x: 3150, y: 3405, face: :south
# Small Bank
spawn_npc name: :banker_495, x: 3252, y: 3418, face: :north
spawn_npc name: :banker_494, x: 3253, y: 3418, face: :north
spawn_npc name: :banker_494, x: 3254, y: 3418, face: :north
spawn_npc name: :banker_494, x: 3256, y: 3418, face: :north
# Big Bank
spawn_npc name: :banker_494, x: 3187, y: 3436, face: :west
spawn_npc name: :banker_495, x: 3187, y: 3438, face: :west
spawn_npc name: :banker_494, x: 3187, y: 3440, face: :west
spawn_npc name: :banker_495, x: 3187, y: 3442, face: :west
spawn_npc name: :banker_494, x: 3187, y: 3444, face: :west
@@ -0,0 +1,18 @@
<?xml version="1.0"?>
<plugin>
<id>location-varrock</id>
<version>0.1</version>
<name>Varrock</name>
<description>Adds functionality to Varrock.</description>
<authors>
<author>Wizard Jesse</author>
</authors>
<scripts>
<script>npcs.rb</script>
<script>shops.rb</script>
</scripts>
<dependencies>
<dependency>entity-spawning</dependency>
<dependency>shops</dependency>
</dependencies>
</plugin>
@@ -0,0 +1,44 @@
create_shop npcs: :aubury, name: "Aubury's Rune Shop.", items: [
[:fire_rune, 5_000], [:water_rune, 5_000], [:air_rune, 5_000], [:earth_rune, 5_000],
[:mind_rune, 5_000], [:body_rune, 5_000 ], [:chaos_rune, 250], [:death_rune, 250 ]
]
create_shop npcs: :lowe, name: "Lowe's Archery Emporium", items: [
[:bronze_arrow, 2_000], [:iron_arrow, 1_500], [:steel_arrow, 1_000],
[:mithril_arrow, 800], [:adamant_arrow, 600], [:shortbow, 4], [:longbow, 4],
[:oak_shortbow, 3], [:oak_longbow, 3], [:willow_shortbow, 2], [:willow_longbow, 2],
[:maple_shortbow, 1], [:maple_longbow, 1], [:crossbow, 2]
]
create_shop npcs: :horvik, buys: :all, name: "Horvik's Armour Shop.", items: [
[:bronze_chainbody, 5], [:iron_chainbody, 3], [:steel_chainbody, 3],
[:mithril_chainbody, 1], [:bronze_platebody, 3], [:iron_platebody, 1],
[:steel_platebody, 1], [:black_platebody, 1], [:mithril_platebody, 1],
[:iron_platelegs, 1], [:studded_body, 1], [:studded_chaps, 1]
]
create_shop npcs: :thessalia, name: "Thessalia's Fine Clothes.", items: [
[:white_apron, 3], [:leather_body, 12], [:leather_gloves, 10], [:leather_boots, 10],
[:brown_apron, 1], [:pink_skirt, 5], [:black_skirt, 3], [:blue_skirt, 2], [:cape, 4],
[:silk, 5], [:priest_gown_428, 3], [:priest_gown_426, 3]
]
create_shop npcs: [:shop_keeper_522, :shop_assistant_523], buys: :all,
name: 'Varrock General Store', items: [
[:pot, 5], [:jug, 2], [:shears, 2], [:bucket, 3], [:bowl, 2], [:cake_tin, 2],
[:tinderbox, 2], [:chisel, 2], [:hammer, 5], [:newcomer_map, 5]
]
create_shop npcs: [:shop_keeper_551, :shop_assistant_552], name: 'Varrock Swordshop', items: [
[:bronze_sword, 5], [:iron_sword, 4], [:steel_sword, 4], [:black_sword, 3],
[:mithril_sword, 3], [:adamant_sword, 2], [:bronze_longsword, 4], [:iron_longsword, 3],
[:steel_longsword, 3], [:black_longsword, 2], [:mithril_longsword, 2],
[:adamant_longsword, 1], [:bronze_dagger, 10], [:iron_dagger, 6], [:steel_dagger, 5],
[:black_dagger, 4], [:mithril_dagger, 3], [:adamant_dagger, 2]
]
create_shop npcs: :zaff, name: "Zaff's Superior Staffs!", items: [
[:battlestaff, 5], [:staff, 5], [:magic_staff, 5], [:staff_of_air, 2],
[:staff_of_water, 2], [:staff_of_earth, 2], [:staff_of_fire, 2]
]