Implemented Observatory Quest

This commit is contained in:
Syndromeramo 2025-11-27 11:59:01 +00:00 committed by Ryan
parent 2239168074
commit da7c62d10c
20 changed files with 2242 additions and 199 deletions

View file

@ -207,6 +207,10 @@
"item_id": "590",
"loc_data": "{1,2368,3135,0,140}-{1,2431,3072,0,140}-{1,3112,3369,2,140}-{1,3209,3734,0,100}-"
},
{
"item_id": "600",
"loc_data": "{1,2438,3187,0,200}-"
},
{
"item_id": "677",
"loc_data": "{1,3369,3378,0,150}-"
@ -671,6 +675,10 @@
"item_id": "11065",
"loc_data": "{1,2928,3289,0,90}-"
},
{
"item_id": "11656",
"loc_data": "{1,2438,3185,0,200}-"
},
{
"item_id": "12494",
"loc_data": "{1,2762,2973,0,60}-"

View file

@ -5575,7 +5575,7 @@
"id": "601"
},
{
"destroy_message": "You'll have to get another down in the Dungeon",
"destroy_message": "You'll have to get another down in the dungeon.",
"examine": "An unusual clay mould in the shape of a disc.",
"durability": null,
"name": "Lens mould",

View file

@ -6227,6 +6227,22 @@
"range_level": "1",
"attack_level": "1"
},
{
"examine": "A man, learned in the ways of the stars.",
"melee_animation": "0",
"range_animation": "0",
"defence_animation": "0",
"magic_animation": "0",
"death_animation": "0",
"name": "Observatory professor",
"defence_level": "1",
"safespot": null,
"lifepoints": "10",
"strength_level": "1",
"id": "488",
"range_level": "1",
"attack_level": "1"
},
{
"examine": "He doesn't look like he'd trust his own mother.",
"melee_animation": "6199",
@ -6237,13 +6253,13 @@
"magic_animation": "0",
"death_animation": "6190",
"name": "Goblin guard",
"defence_level": "20",
"defence_level": "37",
"safespot": null,
"lifepoints": "28",
"strength_level": "20",
"lifepoints": "43",
"strength_level": "37",
"id": "489",
"range_level": "1",
"attack_level": "20"
"attack_level": "32"
},
{
"examine": "If the mummy is at school",
@ -10518,13 +10534,13 @@
"death_animation": "5329",
"name": "Poison spider",
"safespot": null,
"defence_level": "52",
"lifepoints": "64",
"strength_level": "65",
"defence_level": "28",
"lifepoints": "25",
"strength_level": "28",
"id": "1009",
"aggressive": "true",
"range_level": "1",
"attack_level": "50"
"attack_level": "28"
},
{
"examine": "A green skinned croaker",
@ -53255,6 +53271,7 @@
"attack_level": "1"
},
{
"examine": "An ugly green creature.",
"name": "Goblin",
"defence_level": "1",
"safespot": null,
@ -73515,10 +73532,6 @@
"name": "Kalron",
"id": "486"
},
{
"name": "Observatory professor",
"id": "488"
},
{
"name": "Hajedy",
"id": "510"
@ -82651,6 +82664,7 @@
"id": "6114"
},
{
"examine": "A man, learned in the ways of the stars.",
"name": "Observatory professor",
"id": "6119"
},

View file

@ -157,7 +157,7 @@
},
{
"npc_id": "47",
"loc_data": "{2821,3170,0,1,1}-{3341,3267,0,1,5}-{3076,3282,0,1,5}-{3089,3266,0,1,4}-{3091,3266,0,1,4}-{3097,3364,0,1,3}-{3102,3363,0,1,5}-{3127,3487,0,1,4}-{3125,3486,0,1,6}-{3127,3486,0,1,4}-{2603,9480,0,1,1}-{2600,9477,0,1,0}-{2579,9496,0,1,4}-{2580,9508,0,1,0}-{2571,9522,0,1,4}-{2565,9505,0,1,1}-{2566,9510,0,1,6}-{2594,9497,0,1,4}-{2852,9642,0,1,6}-{2858,9632,0,1,3}-{2568,9620,0,1,0}-{2573,9612,0,1,0}-{2579,9631,0,1,0}-{2580,9600,0,1,0}-{2580,9614,0,1,0}-{2580,9620,0,1,0}-{2580,9626,0,1,0}-{2583,9632,0,1,0}-{2584,9625,0,1,0}-{2584,9637,0,1,0}-{2589,9644,0,1,0}-{2590,9601,0,1,0}-{2590,9638,0,1,0}-{2591,9601,0,1,0}-{2591,9621,0,1,0}-{2594,9636,0,1,0}-{2594,9644,0,1,0}-{2597,9604,0,1,0}-{2607,9615,0,1,0}-{2608,9628,0,1,0}-{2614,9651,0,1,0}-{2614,9656,0,1,0}-{2615,9647,0,1,0}-{2615,9661,0,1,0}-{2616,9633,0,1,0}-{2618,9630,0,1,0}-{3108,9754,0,1,5}-{3110,9754,0,1,5}-{3108,9750,0,1,5}-{2592,9831,0,1,3}-{2588,9825,0,1,6}-{2583,9829,0,1,4}-{2581,9841,0,1,0}-{2597,9823,0,1,2}-{2579,9805,0,1,3}-{2576,9804,0,1,0}-{2573,9805,0,1,5}-{2571,9808,0,1,3}-{2576,9810,0,1,2}-{2587,9802,0,1,2}-{2592,9800,0,1,4}-{2596,9805,0,1,6}-{2601,9802,0,1,5}-{2585,9801,0,1,7}-{2594,9803,0,1,0}-{2590,9806,0,1,3}-{2612,9808,0,1,6}-{2604,9810,0,1,6}-{2579,9821,0,1,2}-{2576,9812,0,1,6}-{2580,9813,0,1,6}-{2600,9813,0,1,4}-{2599,9809,0,1,4}-{3158,3226,0,1,5}-{3160,3202,0,1,4}-{3192,3203,0,1,0}-{3194,3204,0,1,0}-{3196,3206,0,1,0}-{3197,3204,0,1,0}-{2654,9640,0,1,6}-{2655,9637,0,1,4}-{2656,9639,0,1,7}-{2651,9636,0,1,5}-{2648,9637,0,1,4}-{2651,9642,0,1,1}-{2654,9640,0,1,0}-{2654,9635,0,1,6}-{2655,9635,0,1,3}-{2664,9626,0,1,6}-{2664,9624,0,1,1}-{2661,9623,0,1,1}-{2663,9623,0,1,3}-{2664,9626,0,1,6}-{2930,9699,0,1,0}-{2933,9697,0,1,0}-{2932,9685,0,1,0}-{2930,9693,0,1,0}-{3235,3224,0,1,3}-{3229,3220,0,1,4}-{3211,3211,0,1,3}-{3225,3220,0,1,1}-{3237,3215,0,1,5}-{3211,3210,0,1,7}-{3227,3220,0,1,7}-{3233,3227,0,1,5}-{3227,3210,0,1,6}-{3228,3222,0,1,4}-{3229,3226,0,1,0}-{3236,3217,0,1,4}-{3259,3230,0,1,4}-{3233,3237,0,1,7}-{3205,3204,0,1,0}-{3206,3204,0,1,0}-{3205,3203,0,1,0}-{3206,3202,0,1,0}-{3207,3202,0,1,0}-{3208,3203,0,1,0}-{3001,3202,0,1,5}-{3243,3687,0,1,5}-{3249,3669,0,1,3}-{3252,3675,0,1,4}-{3252,3680,0,1,3}-{3259,3683,0,1,0}-{3475,9840,0,1,6}-{3481,9842,0,1,1}-{3486,9843,0,1,7}-{3483,9824,0,1,4}-{3496,9808,0,0,5}-{3490,9815,0,1,1}-{3478,9834,0,0,3}-{3490,9824,0,1,4}-{3225,9862,0,1,4}-{3222,9861,0,1,6}-{3220,9860,0,1,6}-{3219,9865,0,1,6}-{3237,9862,0,1,4}-{2536,2982,0,1,3}-{2531,2980,0,1,0}-{2522,2981,0,1,4}-{2545,2989,0,1,4}-{2523,2970,0,1,2}-{3026,3174,0,1,5}-{3019,3176,0,1,7}-{2801,3158,0,1,2}-{2514,3193,0,1,6}-{2518,3192,0,1,3}-{2507,3181,0,1,3}-{2508,3178,0,1,6}-{2511,3183,0,1,3}-{2515,3182,0,1,1}-{3021,3205,0,1,6}-{3019,3292,0,1,7}-{3018,3295,0,1,7}-{2531,3325,0,1,3}-{2530,3327,0,1,5}-{2521,3331,0,1,3}-{2526,3328,0,1,3}-{2523,3331,0,1,4}-{2523,3334,0,1,1}-{2531,3329,0,1,5}-{2532,3333,0,1,5}-{3276,9871,0,1,1}-{3277,9871,0,1,3}-"
"loc_data": "{2821,3170,0,1,1}-{3341,3267,0,1,5}-{3076,3282,0,1,5}-{3089,3266,0,1,4}-{3091,3266,0,1,4}-{3097,3364,0,1,3}-{3102,3363,0,1,5}-{3127,3487,0,1,4}-{3125,3486,0,1,6}-{3127,3486,0,1,4}-{2339,9356,0,1,0}-{2354,9390,0,1,0}-{2361,9403,0,1,0}-{2362,9347,0,1,0}-{2603,9480,0,1,1}-{2600,9477,0,1,0}-{2579,9496,0,1,4}-{2580,9508,0,1,0}-{2571,9522,0,1,4}-{2565,9505,0,1,1}-{2566,9510,0,1,6}-{2594,9497,0,1,4}-{2852,9642,0,1,6}-{2858,9632,0,1,3}-{2568,9620,0,1,0}-{2573,9612,0,1,0}-{2579,9631,0,1,0}-{2580,9600,0,1,0}-{2580,9614,0,1,0}-{2580,9620,0,1,0}-{2580,9626,0,1,0}-{2583,9632,0,1,0}-{2584,9625,0,1,0}-{2584,9637,0,1,0}-{2589,9644,0,1,0}-{2590,9601,0,1,0}-{2590,9638,0,1,0}-{2591,9601,0,1,0}-{2591,9621,0,1,0}-{2594,9636,0,1,0}-{2594,9644,0,1,0}-{2597,9604,0,1,0}-{2607,9615,0,1,0}-{2608,9628,0,1,0}-{2614,9651,0,1,0}-{2614,9656,0,1,0}-{2615,9647,0,1,0}-{2615,9661,0,1,0}-{2616,9633,0,1,0}-{2618,9630,0,1,0}-{3108,9754,0,1,5}-{3110,9754,0,1,5}-{3108,9750,0,1,5}-{2592,9831,0,1,3}-{2588,9825,0,1,6}-{2583,9829,0,1,4}-{2581,9841,0,1,0}-{2597,9823,0,1,2}-{2579,9805,0,1,3}-{2576,9804,0,1,0}-{2573,9805,0,1,5}-{2571,9808,0,1,3}-{2576,9810,0,1,2}-{2587,9802,0,1,2}-{2592,9800,0,1,4}-{2596,9805,0,1,6}-{2601,9802,0,1,5}-{2585,9801,0,1,7}-{2594,9803,0,1,0}-{2590,9806,0,1,3}-{2612,9808,0,1,6}-{2604,9810,0,1,6}-{2579,9821,0,1,2}-{2576,9812,0,1,6}-{2580,9813,0,1,6}-{2600,9813,0,1,4}-{2599,9809,0,1,4}-{3158,3226,0,1,5}-{3160,3202,0,1,4}-{3192,3203,0,1,0}-{3194,3204,0,1,0}-{3196,3206,0,1,0}-{3197,3204,0,1,0}-{2654,9640,0,1,6}-{2655,9637,0,1,4}-{2656,9639,0,1,7}-{2651,9636,0,1,5}-{2648,9637,0,1,4}-{2651,9642,0,1,1}-{2654,9640,0,1,0}-{2654,9635,0,1,6}-{2655,9635,0,1,3}-{2664,9626,0,1,6}-{2664,9624,0,1,1}-{2661,9623,0,1,1}-{2663,9623,0,1,3}-{2664,9626,0,1,6}-{2930,9699,0,1,0}-{2933,9697,0,1,0}-{2932,9685,0,1,0}-{2930,9693,0,1,0}-{3235,3224,0,1,3}-{3229,3220,0,1,4}-{3211,3211,0,1,3}-{3225,3220,0,1,1}-{3237,3215,0,1,5}-{3211,3210,0,1,7}-{3227,3220,0,1,7}-{3233,3227,0,1,5}-{3227,3210,0,1,6}-{3228,3222,0,1,4}-{3229,3226,0,1,0}-{3236,3217,0,1,4}-{3259,3230,0,1,4}-{3233,3237,0,1,7}-{3205,3204,0,1,0}-{3206,3204,0,1,0}-{3205,3203,0,1,0}-{3206,3202,0,1,0}-{3207,3202,0,1,0}-{3208,3203,0,1,0}-{3001,3202,0,1,5}-{3243,3687,0,1,5}-{3249,3669,0,1,3}-{3252,3675,0,1,4}-{3252,3680,0,1,3}-{3259,3683,0,1,0}-{3475,9840,0,1,6}-{3481,9842,0,1,1}-{3486,9843,0,1,7}-{3483,9824,0,1,4}-{3496,9808,0,0,5}-{3490,9815,0,1,1}-{3478,9834,0,0,3}-{3490,9824,0,1,4}-{3225,9862,0,1,4}-{3222,9861,0,1,6}-{3220,9860,0,1,6}-{3219,9865,0,1,6}-{3237,9862,0,1,4}-{2536,2982,0,1,3}-{2531,2980,0,1,0}-{2522,2981,0,1,4}-{2545,2989,0,1,4}-{2523,2970,0,1,2}-{3026,3174,0,1,5}-{3019,3176,0,1,7}-{2801,3158,0,1,2}-{2514,3193,0,1,6}-{2518,3192,0,1,3}-{2507,3181,0,1,3}-{2508,3178,0,1,6}-{2511,3183,0,1,3}-{2515,3182,0,1,1}-{3021,3205,0,1,6}-{3019,3292,0,1,7}-{3018,3295,0,1,7}-{2531,3325,0,1,3}-{2530,3327,0,1,5}-{2521,3331,0,1,3}-{2526,3328,0,1,3}-{2523,3331,0,1,4}-{2523,3334,0,1,1}-{2531,3329,0,1,5}-{2532,3333,0,1,5}-{3276,9871,0,1,1}-{3277,9871,0,1,3}-"
},
{
"npc_id": "48",
@ -193,7 +193,7 @@
},
{
"npc_id": "59",
"loc_data": "{3082,3362,0,1,4}-{2602,9640,0,1,0}-{2603,9635,0,1,0}-{2603,9638,0,1,0}-{2605,9637,0,1,0}-{2605,9639,0,1,0}-{2606,9635,0,1,0}-{2606,9646,0,1,0}-{2607,9637,0,1,0}-{2607,9641,0,1,0}-{2607,9644,0,1,0}-{2607,9648,0,1,0}-{2608,9635,0,1,0}-{2608,9642,0,1,0}-{2609,9639,0,1,0}-{2609,9643,0,1,0}-{3102,9881,0,1,3}-{3095,9883,0,1,2}-{3182,3244,0,1,1}-{3162,3223,0,1,7}-{3164,3242,0,1,0}-{3169,3246,0,1,0}-{3170,3250,0,1,0}-{3166,3247,0,1,0}-{3164,3249,0,1,0}-{3157,3226,0,1,0}-{3163,3227,0,1,0}-{3165,3223,0,1,0}-{3194,3236,0,1,0}-{3146,3347,0,1,3}-{2648,9766,0,1,4}-{2653,9761,0,1,3}-{2483,2877,0,1,3}-{2481,2876,0,1,4}-{2457,2867,0,1,4}-{2481,2847,0,1,0}-{2475,2854,0,1,3}-{2482,2873,0,1,3}-{2485,2876,0,1,2}-{2449,2865,0,1,1}-{2461,2880,0,1,5}-{2489,2935,0,1,7}-{2492,2907,0,1,1}-{2487,2894,0,1,2}-{2487,2888,0,1,7}-{2478,2916,0,1,5}-{2485,2902,0,1,3}-{2487,2902,0,1,2}-{2489,2894,0,1,2}-{2490,2905,0,1,7}-{2490,2917,0,1,5}-{2484,2890,0,1,1}-{2491,2927,0,1,1}-{3250,3239,0,1,1}-{3241,3241,0,1,1}-{3249,3249,0,1,1}-{3218,9890,0,1,3}-{3220,9887,0,1,0}-{3218,9887,0,1,1}-{3218,9889,0,1,5}-{3213,9890,0,1,1}-{2496,2890,0,1,4}-{2503,2889,0,1,1}-{2497,2939,0,1,2}-{2369,3374,0,1,0}-{2372,3379,0,1,0}-{2378,3366,0,1,0}-{2379,3378,0,1,0}-{2387,3370,0,1,0}-{2394,3365,0,1,0}-{2402,3386,0,1,0}-{2405,3381,0,1,0}-{2407,3387,0,1,0}-{2412,3384,0,1,0}-"
"loc_data": "{3082,3362,0,1,4}-{2602,9640,0,1,0}-{2603,9635,0,1,0}-{2603,9638,0,1,0}-{2605,9637,0,1,0}-{2605,9639,0,1,0}-{2606,9635,0,1,0}-{2606,9646,0,1,0}-{2607,9637,0,1,0}-{2607,9641,0,1,0}-{2607,9644,0,1,0}-{2607,9648,0,1,0}-{2608,9635,0,1,0}-{2608,9642,0,1,0}-{2609,9639,0,1,0}-{2609,9643,0,1,0}-{3102,9881,0,1,3}-{3095,9883,0,1,2}-{3182,3244,0,1,1}-{3162,3223,0,1,7}-{3164,3242,0,1,0}-{3169,3246,0,1,0}-{3170,3250,0,1,0}-{3166,3247,0,1,0}-{3164,3249,0,1,0}-{3157,3226,0,1,0}-{3163,3227,0,1,0}-{3165,3223,0,1,0}-{3194,3236,0,1,0}-{3146,3347,0,1,3}-{2369,3374,0,1,0}-{2372,3379,0,1,0}-{2378,3366,0,1,0}-{2379,3378,0,1,0}-{2387,3370,0,1,0}-{2394,3365,0,1,0}-{2402,3386,0,1,0}-{2405,3381,0,1,0}-{2407,3387,0,1,0}-{2412,3384,0,1,0}-{2648,9766,0,1,4}-{2653,9761,0,1,3}-{2483,2877,0,1,3}-{2481,2876,0,1,4}-{2457,2867,0,1,4}-{2481,2847,0,1,0}-{2475,2854,0,1,3}-{2482,2873,0,1,3}-{2485,2876,0,1,2}-{2449,2865,0,1,1}-{2461,2880,0,1,5}-{2489,2935,0,1,7}-{2492,2907,0,1,1}-{2487,2894,0,1,2}-{2487,2888,0,1,7}-{2478,2916,0,1,5}-{2485,2902,0,1,3}-{2487,2902,0,1,2}-{2489,2894,0,1,2}-{2490,2905,0,1,7}-{2490,2917,0,1,5}-{2484,2890,0,1,1}-{2491,2927,0,1,1}-{3250,3239,0,1,1}-{3241,3241,0,1,1}-{3249,3249,0,1,1}-{3218,9890,0,1,3}-{3220,9887,0,1,0}-{3218,9887,0,1,1}-{3218,9889,0,1,5}-{3213,9890,0,1,1}-{2496,2890,0,1,4}-{2503,2889,0,1,1}-{2497,2939,0,1,2}-"
},
{
"npc_id": "60",
@ -217,15 +217,15 @@
},
{
"npc_id": "66",
"loc_data": "{2417,3493,1,1,0}-{2418,3495,1,1,0}-{2383,3452,0,1,0}-{2401,3417,0,1,0}-{2402,3422,0,1,0}-{2402,3441,0,1,0}-{2403,3430,0,1,0}-{2408,3441,0,1,0}-{2409,3430,0,1,0}-{2423,3426,0,1,0}-{2427,3428,0,1,0}-{2427,3440,0,1,0}-{2526,3168,0,1,0}-{2529,3163,0,1,0}-{2530,3172,0,1,0}-{2536,3169,0,1,0}-{2435,3460,0,1,0}-{2440,3470,0,1,0}-{2447,3502,0,1,0}-{2457,3462,0,1,0}-{2478,3502,0,1,0}-{2449,3492,1,1,0}-{2450,3490,1,1,0}-{2474,3490,1,1,0}-{2482,3492,1,1,0}-{2482,3498,1,1,0}-{2399,3356,0,1,0}-"
"loc_data": "{2399,3356,0,1,0}-{2383,3452,0,1,0}-{2401,3417,0,1,0}-{2402,3422,0,1,0}-{2402,3441,0,1,0}-{2403,3430,0,1,0}-{2408,3441,0,1,0}-{2409,3430,0,1,0}-{2423,3426,0,1,0}-{2427,3428,0,1,0}-{2427,3440,0,1,0}-{2417,3493,1,1,0}-{2418,3495,1,1,0}-{2435,3460,0,1,0}-{2440,3470,0,1,0}-{2447,3502,0,1,0}-{2457,3462,0,1,0}-{2478,3502,0,1,0}-{2449,3492,1,1,0}-{2450,3490,1,1,0}-{2474,3490,1,1,0}-{2482,3492,1,1,0}-{2482,3498,1,1,0}-{2526,3168,0,1,0}-{2529,3163,0,1,0}-{2530,3172,0,1,0}-{2536,3169,0,1,0}-"
},
{
"npc_id": "67",
"loc_data": "{2556,3226,0,1,0}-{2456,3425,0,1,0}-{2459,3421,0,1,0}-{2462,3431,0,1,0}-{2394,3500,1,1,0}-{2417,3483,1,1,0}-{2377,3442,0,1,0}-{2380,3425,0,1,0}-{2383,3433,0,1,0}-{2405,3447,0,1,0}-{2406,3440,0,1,0}-{2393,3451,1,1,0}-{2408,3437,1,1,0}-{2521,3169,0,1,0}-{2521,3171,0,1,0}-{2033,5530,1,1,0}-{2437,3478,0,1,0}-{2442,3465,0,1,0}-{2456,3467,0,1,0}-{2471,3496,0,1,0}-{2474,3508,0,1,0}-{2475,3471,0,1,0}-{2479,3468,0,1,0}-{2486,3470,0,1,0}-{2492,3474,0,1,0}-{2443,3464,1,1,0}-{2443,3502,1,1,0}-{2448,3496,1,1,0}-{2449,3506,1,1,0}-{2457,3498,1,1,0}-{2474,3498,1,1,0}-{2480,3502,1,1,0}-{2481,3482,1,1,0}-{2490,3503,1,1,0}-{2400,3356,0,1,0}-"
"loc_data": "{2400,3356,0,1,0}-{2377,3442,0,1,0}-{2380,3425,0,1,0}-{2383,3433,0,1,0}-{2405,3447,0,1,0}-{2406,3440,0,1,0}-{2393,3451,1,1,0}-{2408,3437,1,1,0}-{2394,3500,1,1,0}-{2417,3483,1,1,0}-{2456,3425,0,1,0}-{2459,3421,0,1,0}-{2462,3431,0,1,0}-{2437,3478,0,1,0}-{2442,3465,0,1,0}-{2456,3467,0,1,0}-{2471,3496,0,1,0}-{2474,3508,0,1,0}-{2475,3471,0,1,0}-{2479,3468,0,1,0}-{2486,3470,0,1,0}-{2492,3474,0,1,0}-{2443,3464,1,1,0}-{2443,3502,1,1,0}-{2448,3496,1,1,0}-{2449,3506,1,1,0}-{2457,3498,1,1,0}-{2474,3498,1,1,0}-{2480,3502,1,1,0}-{2481,3482,1,1,0}-{2490,3503,1,1,0}-{2521,3169,0,1,0}-{2521,3171,0,1,0}-{2556,3226,0,1,0}-{2033,5530,1,1,0}-"
},
{
"npc_id": "68",
"loc_data": "{2400,3514,1,1,0}-{2418,3485,1,1,0}-{2378,3423,0,1,0}-{2393,3435,0,1,0}-{2394,3425,0,1,0}-{2395,3449,0,1,0}-{2403,3433,0,1,0}-{2420,3429,0,1,0}-{2420,3438,0,1,0}-{2522,3172,0,1,0}-{2433,3474,0,1,0}-{2433,3492,0,1,0}-{2458,3497,0,1,0}-{2464,3505,0,1,0}-{2476,3458,0,1,0}-{2445,3502,1,1,0}-{2453,3488,1,1,0}-{2475,3502,1,1,0}-{2465,3490,2,1,0}-{2401,3357,0,1,0}-"
"loc_data": "{2401,3357,0,1,0}-{2378,3423,0,1,0}-{2393,3435,0,1,0}-{2394,3425,0,1,0}-{2395,3449,0,1,0}-{2403,3433,0,1,0}-{2420,3429,0,1,0}-{2420,3438,0,1,0}-{2400,3514,1,1,0}-{2418,3485,1,1,0}-{2433,3474,0,1,0}-{2433,3492,0,1,0}-{2458,3497,0,1,0}-{2464,3505,0,1,0}-{2476,3458,0,1,0}-{2445,3502,1,1,0}-{2453,3488,1,1,0}-{2475,3502,1,1,0}-{2465,3490,2,1,0}-{2522,3172,0,1,0}-"
},
{
"npc_id": "73",
@ -325,11 +325,11 @@
},
{
"npc_id": "100",
"loc_data": "{2567,3440,0,1,3}-{2564,9653,0,1,0}-{2565,9655,0,1,0}-{2566,9626,0,1,0}-{2567,9653,0,1,0}-{2569,9633,0,1,0}-{2607,9621,0,1,0}-{2551,3408,0,1,6}-{2553,3405,0,1,3}-{2559,3452,0,1,3}-"
"loc_data": "{2567,3440,0,1,3}-{2316,9392,0,1,0}-{2319,9367,0,1,0}-{2321,9402,0,1,0}-{2322,9387,0,1,0}-{2325,9360,0,1,0}-{2333,9346,0,1,0}-{2335,9382,0,1,0}-{2337,9387,0,1,0}-{2343,9360,0,1,0}-{2344,9369,0,1,0}-{2348,9390,0,1,0}-{2349,9380,0,1,0}-{2349,9402,0,1,0}-{2359,9345,0,1,0}-{2359,9359,0,1,0}-{2359,9374,0,1,0}-{2359,9382,0,1,0}-{2363,9403,0,1,0}-{2564,9653,0,1,0}-{2565,9655,0,1,0}-{2566,9626,0,1,0}-{2567,9653,0,1,0}-{2569,9633,0,1,0}-{2607,9621,0,1,0}-{2551,3408,0,1,6}-{2553,3405,0,1,3}-{2559,3452,0,1,3}-"
},
{
"npc_id": "101",
"loc_data": "{2622,3389,0,1,4}-{2619,3390,0,1,4}-{2573,3437,0,1,3}-{2562,9659,0,1,0}-{2563,9661,0,1,0}-{2599,9626,0,1,0}-{2601,9627,0,1,0}-{2605,9621,0,1,0}-{2610,9620,0,1,0}-{2624,3391,0,1,1}-{2555,3407,0,1,3}-{2553,3457,0,1,3}-"
"loc_data": "{2622,3389,0,1,4}-{2619,3390,0,1,4}-{2573,3437,0,1,3}-{2305,9385,0,1,0}-{2307,9359,0,1,0}-{2307,9403,0,1,0}-{2310,9396,0,1,0}-{2317,9371,0,1,0}-{2317,9383,0,1,0}-{2324,9404,0,1,0}-{2333,9366,0,1,0}-{2335,9393,0,1,0}-{2339,9403,0,1,0}-{2342,9347,0,1,0}-{2351,9359,0,1,0}-{2359,9392,0,1,0}-{2562,9659,0,1,0}-{2563,9661,0,1,0}-{2599,9626,0,1,0}-{2601,9627,0,1,0}-{2605,9621,0,1,0}-{2610,9620,0,1,0}-{2624,3391,0,1,1}-{2555,3407,0,1,3}-{2553,3457,0,1,3}-"
},
{
"npc_id": "102",
@ -345,7 +345,7 @@
},
{
"npc_id": "105",
"loc_data": "{3100,3594,0,1,6}-{3107,3608,0,1,2}-{3099,3602,0,1,0}-{2632,3280,0,1,1}-{2633,3274,0,1,3}-{2696,3329,0,1,4}-{2708,3336,0,1,4}-{3230,3500,0,1,5}-{2988,3671,0,1,0}-{3001,3674,0,1,0}-{2497,3164,0,1,2}-{2387,3376,0,1,0}-{2398,3366,0,1,0}-{2412,3378,0,1,0}-{2419,3372,0,1,0}-"
"loc_data": "{3100,3594,0,1,6}-{3107,3608,0,1,2}-{3099,3602,0,1,0}-{2632,3280,0,1,1}-{2633,3274,0,1,3}-{2387,3376,0,1,0}-{2398,3366,0,1,0}-{2412,3378,0,1,0}-{2419,3372,0,1,0}-{2696,3329,0,1,4}-{2708,3336,0,1,4}-{3230,3500,0,1,5}-{2988,3671,0,1,0}-{3001,3674,0,1,0}-{2497,3164,0,1,2}-"
},
{
"npc_id": "106",
@ -365,7 +365,7 @@
},
{
"npc_id": "110",
"loc_data": "{2564,9887,0,1,4}-{2581,9897,0,1,1}-{2577,9888,0,1,1}-{3234,5497,0,1,1}-{3305,9400,0,1,1}-{3244,9356,0,1,1}-{3252,9370,0,1,1}-{3294,9375,0,1,3}-{3050,10337,0,1,4}-{3047,10340,0,1,4}-{3048,10346,0,1,4}-{3048,10346,0,1,3}-"
"loc_data": "{2564,9887,0,1,4}-{2581,9897,0,1,1}-{2577,9888,0,1,1}-{3234,5497,0,1,1}-{3244,9356,0,1,1}-{3252,9370,0,1,1}-{3305,9400,0,1,1}-{3294,9375,0,1,3}-{3050,10337,0,1,4}-{3047,10340,0,1,4}-{3048,10346,0,1,4}-{3048,10346,0,1,3}-"
},
{
"npc_id": "111",
@ -389,7 +389,7 @@
},
{
"npc_id": "117",
"loc_data": "{2369,3404,0,1,0}-{3118,9845,0,1,4}-{3111,9844,0,1,6}-{3123,9845,0,1,3}-{3114,9833,0,1,3}-{3110,9841,0,1,1}-{3119,9839,0,1,1}-{3097,9832,0,1,0}-{3101,9832,0,1,1}-{3107,9829,0,1,3}-{3115,9831,0,1,4}-{3109,9835,0,1,4}-{2904,9734,0,1,0}-{2548,3146,0,1,1}-{2542,3145,0,1,4}-{2503,3150,0,1,4}-{3300,3649,0,1,0}-{3044,10321,0,1,2}-{3044,10316,0,1,4}-{3045,10308,0,1,4}-{3048,10317,0,1,2}-"
"loc_data": "{3118,9845,0,1,4}-{3111,9844,0,1,6}-{3123,9845,0,1,3}-{3114,9833,0,1,3}-{3110,9841,0,1,1}-{3119,9839,0,1,1}-{3097,9832,0,1,0}-{3101,9832,0,1,1}-{3107,9829,0,1,3}-{3115,9831,0,1,4}-{3109,9835,0,1,4}-{2369,3404,0,1,0}-{2904,9734,0,1,0}-{2548,3146,0,1,1}-{2542,3145,0,1,4}-{2503,3150,0,1,4}-{3300,3649,0,1,0}-{3044,10321,0,1,2}-{3044,10316,0,1,4}-{3045,10308,0,1,4}-{3048,10317,0,1,2}-"
},
{
"npc_id": "118",
@ -489,23 +489,23 @@
},
{
"npc_id": "153",
"loc_data": "{2540,9820,0,1,0}-{2543,9813,0,1,0}-{2546,9817,0,1,0}-{2464,4421,0,1,0}-{2466,4423,0,1,0}-{2486,4464,0,1,0}-{2556,3444,0,1,0}-{3082,3077,0,1,0}-{3092,3082,0,1,0}-{3109,3090,0,1,0}-{3112,3093,0,1,0}-{2249,3260,0,1,0}-{2250,3257,0,1,0}-{2250,3259,0,1,0}-{2252,3261,0,1,0}-{2253,3256,0,1,0}-{2262,3226,0,1,0}-{2264,3225,0,1,0}-{2266,3229,0,1,0}-{2268,3227,0,1,0}-{2269,3222,0,1,0}-{2269,3224,0,1,0}-{2270,3223,0,1,0}-{2270,3226,0,1,0}-{3200,5954,0,1,0}-{3202,5958,0,1,0}-{3204,5955,0,1,0}-{3204,5959,0,1,0}-{3231,5967,0,1,0}-{3236,5974,0,1,0}-{3237,5968,0,1,0}-{3240,5992,0,1,0}-{3240,5994,0,1,0}-{3242,5990,0,1,0}-{3242,5993,0,1,0}-{3244,5994,0,1,0}-{3246,5989,0,1,0}-{2196,3191,0,1,0}-{2197,3189,0,1,0}-{2198,3181,0,1,0}-{2198,3187,0,1,0}-{2199,3183,0,1,0}-{2199,3187,0,1,0}-{2200,3185,0,1,0}-{2201,3185,0,1,0}-{2204,3180,0,1,0}-{2324,4599,0,1,0}-{2325,4597,0,1,0}-{2326,4589,0,1,0}-{2326,4595,0,1,0}-{2327,4591,0,1,0}-{2327,4595,0,1,0}-{2328,4593,0,1,0}-{2329,4593,0,1,0}-{2332,4588,0,1,0}-{2176,3202,0,1,0}-{2178,3206,0,1,0}-{2180,3203,0,1,0}-{2180,3207,0,1,0}-{2207,3215,0,1,0}-{2212,3222,0,1,0}-{2213,3216,0,1,0}-{2216,3240,0,1,0}-{2216,3242,0,1,0}-{2218,3238,0,1,0}-{2218,3241,0,1,0}-{2220,3242,0,1,0}-{2222,3237,0,1,0}-{2437,3425,0,1,0}-{2438,3422,0,1,0}-{2450,3419,0,1,0}-{2415,4466,0,1,0}-{2419,4427,0,1,0}-{2421,4468,0,1,0}-{2426,4431,0,1,0}-{3175,3226,0,1,0}-{3178,3228,0,1,0}-{3179,3226,0,1,0}-{3182,3251,0,1,0}-{3183,3254,0,1,0}-{2697,6204,0,1,0}-{2698,6201,0,1,0}-{2698,6203,0,1,0}-{2700,6205,0,1,0}-{2701,6200,0,1,0}-{2710,6170,0,1,0}-{2712,6169,0,1,0}-{2714,6173,0,1,0}-{2716,6171,0,1,0}-{2717,6166,0,1,0}-{2717,6168,0,1,0}-{2718,6167,0,1,0}-{2718,6170,0,1,0}-{2478,3373,0,1,0}-{2479,3381,0,1,0}-{2481,3384,0,1,0}-{2490,3371,0,1,0}-{2689,6083,0,1,0}-{2689,6088,0,1,0}-{2690,6094,0,1,0}-{2691,6084,0,1,0}-{2692,6081,0,1,0}-{2692,6090,0,1,0}-{2693,6083,0,1,0}-{2693,6085,0,1,0}-{2693,6090,0,1,0}-{2694,6083,0,1,0}-{2694,6086,0,1,0}-{2695,6082,0,1,0}-{2695,6085,0,1,0}-{2695,6088,0,1,0}-{2695,6091,0,1,0}-{2695,6121,0,1,0}-{2698,6121,0,1,0}-{2699,6082,0,1,0}-{2699,6085,0,1,0}-{2700,6084,0,1,0}-{2701,6085,0,1,0}-{2702,6081,0,1,0}-{2702,6083,0,1,0}-{2703,6119,0,1,0}-{2704,6117,0,1,0}-{2705,6121,0,1,0}-{2730,6091,0,1,0}-{2732,6095,0,1,0}-{2734,6090,0,1,0}-{2735,6094,0,1,0}-{2735,6097,0,1,0}-{2738,6098,0,1,0}-{2416,3404,0,1,0}-{2424,3410,0,1,0}-{2430,3405,0,1,0}-{1906,5223,0,1,0}-{1907,5221,0,1,0}-{3273,6012,0,1,0}-{3274,6009,0,1,0}-{3274,6011,0,1,0}-{3276,6013,0,1,0}-{3277,6008,0,1,0}-{3286,5978,0,1,0}-{3288,5977,0,1,0}-{3290,5981,0,1,0}-{3292,5979,0,1,0}-{3293,5974,0,1,0}-{3293,5976,0,1,0}-{3294,5975,0,1,0}-{3294,5978,0,1,0}-{2828,5091,0,1,0}-{2832,5108,0,1,0}-{2835,5079,0,1,0}-{2846,5067,0,1,0}-{2850,5111,0,1,0}-{2853,5086,0,1,0}-{2864,5071,0,1,0}-{2549,3139,0,1,0}-{2241,3139,0,1,0}-{2241,3144,0,1,0}-{2242,3150,0,1,0}-{2243,3140,0,1,0}-{2244,3137,0,1,0}-{2244,3146,0,1,0}-{2245,3139,0,1,0}-{2245,3141,0,1,0}-{2245,3146,0,1,0}-{2246,3139,0,1,0}-{2246,3142,0,1,0}-{2247,3138,0,1,0}-{2247,3141,0,1,0}-{2247,3144,0,1,0}-{2247,3147,0,1,0}-{2247,3177,0,1,0}-{2250,3177,0,1,0}-{2251,3138,0,1,0}-{2251,3141,0,1,0}-{2252,3140,0,1,0}-{2253,3141,0,1,0}-{2254,3137,0,1,0}-{2254,3139,0,1,0}-{2255,3175,0,1,0}-{2256,3173,0,1,0}-{2257,3177,0,1,0}-{2282,3147,0,1,0}-{2284,3151,0,1,0}-{2286,3146,0,1,0}-{2287,3150,0,1,0}-{2287,3153,0,1,0}-{2290,3154,0,1,0}-"
"loc_data": "{3082,3077,0,1,0}-{3092,3082,0,1,0}-{3109,3090,0,1,0}-{3112,3093,0,1,0}-{2324,4599,0,1,0}-{2325,4597,0,1,0}-{2326,4589,0,1,0}-{2326,4595,0,1,0}-{2327,4591,0,1,0}-{2327,4595,0,1,0}-{2328,4593,0,1,0}-{2329,4593,0,1,0}-{2332,4588,0,1,0}-{2828,5091,0,1,0}-{2832,5108,0,1,0}-{2835,5079,0,1,0}-{2846,5067,0,1,0}-{2850,5111,0,1,0}-{2853,5086,0,1,0}-{2864,5071,0,1,0}-{3175,3226,0,1,0}-{3178,3228,0,1,0}-{3179,3226,0,1,0}-{3182,3251,0,1,0}-{3183,3254,0,1,0}-{2416,3404,0,1,0}-{2424,3410,0,1,0}-{2430,3405,0,1,0}-{2415,4466,0,1,0}-{2419,4427,0,1,0}-{2421,4468,0,1,0}-{2426,4431,0,1,0}-{1906,5223,0,1,0}-{1907,5221,0,1,0}-{2196,3191,0,1,0}-{2197,3189,0,1,0}-{2198,3181,0,1,0}-{2198,3187,0,1,0}-{2199,3183,0,1,0}-{2199,3187,0,1,0}-{2200,3185,0,1,0}-{2201,3185,0,1,0}-{2204,3180,0,1,0}-{2176,3202,0,1,0}-{2178,3206,0,1,0}-{2180,3203,0,1,0}-{2180,3207,0,1,0}-{2207,3215,0,1,0}-{2212,3222,0,1,0}-{2213,3216,0,1,0}-{2216,3240,0,1,0}-{2216,3242,0,1,0}-{2218,3238,0,1,0}-{2218,3241,0,1,0}-{2220,3242,0,1,0}-{2222,3237,0,1,0}-{2478,3373,0,1,0}-{2479,3381,0,1,0}-{2481,3384,0,1,0}-{2490,3371,0,1,0}-{2437,3425,0,1,0}-{2438,3422,0,1,0}-{2450,3419,0,1,0}-{2464,4421,0,1,0}-{2466,4423,0,1,0}-{2486,4464,0,1,0}-{3200,5954,0,1,0}-{3202,5958,0,1,0}-{3204,5955,0,1,0}-{3204,5959,0,1,0}-{3231,5967,0,1,0}-{3236,5974,0,1,0}-{3237,5968,0,1,0}-{3240,5992,0,1,0}-{3240,5994,0,1,0}-{3242,5990,0,1,0}-{3242,5993,0,1,0}-{3244,5994,0,1,0}-{3246,5989,0,1,0}-{2689,6083,0,1,0}-{2689,6088,0,1,0}-{2690,6094,0,1,0}-{2691,6084,0,1,0}-{2692,6081,0,1,0}-{2692,6090,0,1,0}-{2693,6083,0,1,0}-{2693,6085,0,1,0}-{2693,6090,0,1,0}-{2694,6083,0,1,0}-{2694,6086,0,1,0}-{2695,6082,0,1,0}-{2695,6085,0,1,0}-{2695,6088,0,1,0}-{2695,6091,0,1,0}-{2695,6121,0,1,0}-{2698,6121,0,1,0}-{2699,6082,0,1,0}-{2699,6085,0,1,0}-{2700,6084,0,1,0}-{2701,6085,0,1,0}-{2702,6081,0,1,0}-{2702,6083,0,1,0}-{2703,6119,0,1,0}-{2704,6117,0,1,0}-{2705,6121,0,1,0}-{2730,6091,0,1,0}-{2732,6095,0,1,0}-{2734,6090,0,1,0}-{2735,6094,0,1,0}-{2735,6097,0,1,0}-{2738,6098,0,1,0}-{2697,6204,0,1,0}-{2698,6201,0,1,0}-{2698,6203,0,1,0}-{2700,6205,0,1,0}-{2701,6200,0,1,0}-{2710,6170,0,1,0}-{2712,6169,0,1,0}-{2714,6173,0,1,0}-{2716,6171,0,1,0}-{2717,6166,0,1,0}-{2717,6168,0,1,0}-{2718,6167,0,1,0}-{2718,6170,0,1,0}-{2549,3139,0,1,0}-{2241,3139,0,1,0}-{2241,3144,0,1,0}-{2242,3150,0,1,0}-{2243,3140,0,1,0}-{2244,3137,0,1,0}-{2244,3146,0,1,0}-{2245,3139,0,1,0}-{2245,3141,0,1,0}-{2245,3146,0,1,0}-{2246,3139,0,1,0}-{2246,3142,0,1,0}-{2247,3138,0,1,0}-{2247,3141,0,1,0}-{2247,3144,0,1,0}-{2247,3147,0,1,0}-{2247,3177,0,1,0}-{2250,3177,0,1,0}-{2251,3138,0,1,0}-{2251,3141,0,1,0}-{2252,3140,0,1,0}-{2253,3141,0,1,0}-{2254,3137,0,1,0}-{2254,3139,0,1,0}-{2255,3175,0,1,0}-{2256,3173,0,1,0}-{2257,3177,0,1,0}-{2282,3147,0,1,0}-{2284,3151,0,1,0}-{2286,3146,0,1,0}-{2287,3150,0,1,0}-{2287,3153,0,1,0}-{2290,3154,0,1,0}-{2249,3260,0,1,0}-{2250,3257,0,1,0}-{2250,3259,0,1,0}-{2252,3261,0,1,0}-{2253,3256,0,1,0}-{2262,3226,0,1,0}-{2264,3225,0,1,0}-{2266,3229,0,1,0}-{2268,3227,0,1,0}-{2269,3222,0,1,0}-{2269,3224,0,1,0}-{2270,3223,0,1,0}-{2270,3226,0,1,0}-{2556,3444,0,1,0}-{3273,6012,0,1,0}-{3274,6009,0,1,0}-{3274,6011,0,1,0}-{3276,6013,0,1,0}-{3277,6008,0,1,0}-{3286,5978,0,1,0}-{3288,5977,0,1,0}-{3290,5981,0,1,0}-{3292,5979,0,1,0}-{3293,5974,0,1,0}-{3293,5976,0,1,0}-{3294,5975,0,1,0}-{3294,5978,0,1,0}-{2540,9820,0,1,0}-{2543,9813,0,1,0}-{2546,9817,0,1,0}-"
},
{
"npc_id": "154",
"loc_data": "{2475,4459,0,1,0}-{2480,4458,0,1,0}-{2481,4454,0,1,0}-{2488,4465,0,1,0}-{3125,3084,0,1,0}-{2268,3228,0,1,0}-{3202,5955,0,1,0}-{3206,5953,0,1,0}-{3231,5976,0,1,0}-{3233,5974,0,1,0}-{3235,5970,0,1,0}-{3241,5996,0,1,0}-{3242,5988,0,1,0}-{3244,5992,0,1,0}-{2180,3173,0,1,0}-{2193,3187,0,1,0}-{2196,3184,0,1,0}-{2200,3181,0,1,0}-{2200,3188,0,1,0}-{2203,3189,0,1,0}-{2308,4581,0,1,0}-{2321,4595,0,1,0}-{2324,4592,0,1,0}-{2328,4589,0,1,0}-{2328,4596,0,1,0}-{2331,4597,0,1,0}-{2178,3203,0,1,0}-{2182,3201,0,1,0}-{2207,3224,0,1,0}-{2209,3222,0,1,0}-{2211,3218,0,1,0}-{2217,3244,0,1,0}-{2218,3236,0,1,0}-{2220,3240,0,1,0}-{2446,3396,0,1,0}-{2470,3397,0,1,0}-{2394,4453,0,1,0}-{2394,4457,0,1,0}-{2406,4447,0,1,0}-{2422,3489,0,1,0}-{2716,6172,0,1,0}-{2688,6092,0,1,0}-{2690,6087,0,1,0}-{2690,6095,0,1,0}-{2692,6082,0,1,0}-{2692,6088,0,1,0}-{2692,6123,0,1,0}-{2693,6081,0,1,0}-{2694,6125,0,1,0}-{2695,6087,0,1,0}-{2697,6086,0,1,0}-{2697,6087,0,1,0}-{2698,6081,0,1,0}-{2698,6124,0,1,0}-{2700,6083,0,1,0}-{2702,6084,0,1,0}-{2726,6085,0,1,0}-{2727,6081,0,1,0}-{2729,6083,0,1,0}-{2732,6084,0,1,0}-{2378,3418,0,1,0}-{2380,3422,0,1,0}-{2393,3442,0,1,0}-{2397,3440,0,1,0}-{2423,3399,0,1,0}-{2425,3406,0,1,0}-{2427,3402,0,1,0}-{1908,5222,0,1,0}-{3292,5980,0,1,0}-{2831,5070,0,1,0}-{2843,5106,0,1,0}-{2844,5080,0,1,0}-{2860,5079,0,1,0}-{2866,5104,0,1,0}-{2868,5096,0,1,0}-{2240,3148,0,1,0}-{2242,3143,0,1,0}-{2242,3151,0,1,0}-{2244,3138,0,1,0}-{2244,3144,0,1,0}-{2244,3179,0,1,0}-{2245,3137,0,1,0}-{2246,3181,0,1,0}-{2247,3143,0,1,0}-{2249,3142,0,1,0}-{2249,3143,0,1,0}-{2250,3137,0,1,0}-{2250,3180,0,1,0}-{2252,3139,0,1,0}-{2254,3140,0,1,0}-{2278,3141,0,1,0}-{2279,3137,0,1,0}-{2281,3139,0,1,0}-{2284,3140,0,1,0}-"
"loc_data": "{3125,3084,0,1,0}-{2308,4581,0,1,0}-{2321,4595,0,1,0}-{2324,4592,0,1,0}-{2328,4589,0,1,0}-{2328,4596,0,1,0}-{2331,4597,0,1,0}-{2831,5070,0,1,0}-{2843,5106,0,1,0}-{2844,5080,0,1,0}-{2860,5079,0,1,0}-{2866,5104,0,1,0}-{2868,5096,0,1,0}-{2378,3418,0,1,0}-{2380,3422,0,1,0}-{2393,3442,0,1,0}-{2397,3440,0,1,0}-{2423,3399,0,1,0}-{2425,3406,0,1,0}-{2427,3402,0,1,0}-{2422,3489,0,1,0}-{2394,4453,0,1,0}-{2394,4457,0,1,0}-{2406,4447,0,1,0}-{1908,5222,0,1,0}-{2180,3173,0,1,0}-{2193,3187,0,1,0}-{2196,3184,0,1,0}-{2200,3181,0,1,0}-{2200,3188,0,1,0}-{2203,3189,0,1,0}-{2178,3203,0,1,0}-{2182,3201,0,1,0}-{2207,3224,0,1,0}-{2209,3222,0,1,0}-{2211,3218,0,1,0}-{2217,3244,0,1,0}-{2218,3236,0,1,0}-{2220,3240,0,1,0}-{2446,3396,0,1,0}-{2470,3397,0,1,0}-{2475,4459,0,1,0}-{2480,4458,0,1,0}-{2481,4454,0,1,0}-{2488,4465,0,1,0}-{3202,5955,0,1,0}-{3206,5953,0,1,0}-{3231,5976,0,1,0}-{3233,5974,0,1,0}-{3235,5970,0,1,0}-{3241,5996,0,1,0}-{3242,5988,0,1,0}-{3244,5992,0,1,0}-{2688,6092,0,1,0}-{2690,6087,0,1,0}-{2690,6095,0,1,0}-{2692,6082,0,1,0}-{2692,6088,0,1,0}-{2692,6123,0,1,0}-{2693,6081,0,1,0}-{2694,6125,0,1,0}-{2695,6087,0,1,0}-{2697,6086,0,1,0}-{2697,6087,0,1,0}-{2698,6081,0,1,0}-{2698,6124,0,1,0}-{2700,6083,0,1,0}-{2702,6084,0,1,0}-{2726,6085,0,1,0}-{2727,6081,0,1,0}-{2729,6083,0,1,0}-{2732,6084,0,1,0}-{2716,6172,0,1,0}-{2240,3148,0,1,0}-{2242,3143,0,1,0}-{2242,3151,0,1,0}-{2244,3138,0,1,0}-{2244,3144,0,1,0}-{2244,3179,0,1,0}-{2245,3137,0,1,0}-{2246,3181,0,1,0}-{2247,3143,0,1,0}-{2249,3142,0,1,0}-{2249,3143,0,1,0}-{2250,3137,0,1,0}-{2250,3180,0,1,0}-{2252,3139,0,1,0}-{2254,3140,0,1,0}-{2278,3141,0,1,0}-{2279,3137,0,1,0}-{2281,3139,0,1,0}-{2284,3140,0,1,0}-{2268,3228,0,1,0}-{3292,5980,0,1,0}-"
},
{
"npc_id": "155",
"loc_data": "{3093,3086,0,1,0}-{3097,3085,0,1,0}-{3129,3091,0,1,0}-{3135,3084,0,1,0}-{2190,3180,0,1,0}-{2318,4588,0,1,0}-{2374,3469,0,1,0}-{2376,3466,0,1,0}-{3254,3230,0,1,0}-{1986,5564,0,1,0}-{2434,3516,0,1,0}-{2479,3501,0,1,0}-"
"loc_data": "{3093,3086,0,1,0}-{3097,3085,0,1,0}-{3129,3091,0,1,0}-{3135,3084,0,1,0}-{2318,4588,0,1,0}-{2374,3469,0,1,0}-{2376,3466,0,1,0}-{2190,3180,0,1,0}-{3254,3230,0,1,0}-{2434,3516,0,1,0}-{2479,3501,0,1,0}-{1986,5564,0,1,0}-"
},
{
"npc_id": "156",
"loc_data": "{2371,3460,0,1,0}-{2372,3456,0,1,0}-{2422,3467,0,1,0}-{2725,6127,0,1,0}-{2444,3491,0,1,0}-{2277,3183,0,1,0}-"
"loc_data": "{2371,3460,0,1,0}-{2372,3456,0,1,0}-{2422,3467,0,1,0}-{2444,3491,0,1,0}-{2725,6127,0,1,0}-{2277,3183,0,1,0}-"
},
{
"npc_id": "157",
"loc_data": "{2180,2798,0,1,0}-{2209,2812,0,1,0}-{2217,2780,0,1,0}-{1921,5931,0,1,0}-{1947,5908,0,1,0}-{1955,5949,0,1,0}-{1973,5888,0,1,0}-{1975,5918,0,1,0}-{1988,5870,0,1,0}-{2017,5884,0,1,0}-{2025,5852,0,1,0}-{2182,2979,0,1,0}-{2211,2963,0,1,0}-{1931,6038,0,1,0}-{1983,6037,0,1,0}-{2153,2810,0,1,0}-{2172,2806,0,1,0}-{1961,5882,0,1,0}-{1980,5878,0,1,0}-{2242,2788,0,1,0}-{2248,2858,0,1,0}-{2256,2828,0,1,0}-{2284,2874,0,1,0}-{2255,3216,0,1,0}-{2262,3210,0,1,0}-{2271,3204,0,1,0}-{2294,3219,0,1,0}-{2296,3206,0,1,0}-{2298,3201,0,1,0}-{2056,5930,0,1,0}-{2064,5900,0,1,0}-{2092,5946,0,1,0}-{2050,5860,0,1,0}-{3201,5986,0,1,0}-{3254,5972,0,1,0}-{3255,5986,0,1,0}-{3256,6008,0,1,0}-{3257,5973,0,1,0}-{3257,5975,0,1,0}-{3260,5974,0,1,0}-{3261,5977,0,1,0}-{3262,5957,0,1,0}-{2194,3158,0,1,0}-{2216,3188,0,1,0}-{2217,3190,0,1,0}-{2220,3158,0,1,0}-{2222,3141,0,1,0}-{2229,3138,0,1,0}-{2231,3181,0,1,0}-{2236,3155,0,1,0}-{2278,2956,0,1,0}-{2322,4566,0,1,0}-{2344,4596,0,1,0}-{2345,4598,0,1,0}-{2348,4566,0,1,0}-{2350,4549,0,1,0}-{2357,4546,0,1,0}-{2359,4589,0,1,0}-{2364,4563,0,1,0}-{2177,3234,0,1,0}-{2230,3220,0,1,0}-{2231,3234,0,1,0}-{2232,3256,0,1,0}-{2233,3221,0,1,0}-{2233,3223,0,1,0}-{2236,3222,0,1,0}-{2237,3225,0,1,0}-{2238,3205,0,1,0}-{2479,3396,0,1,0}-{2102,2942,0,1,0}-{2108,2919,0,1,0}-{2104,2873,0,1,0}-{2122,6032,0,1,0}-{1912,5945,0,1,0}-{3143,3210,0,1,0}-{3155,3253,0,1,0}-{3163,3261,0,1,0}-{3168,3258,0,1,0}-{2086,6028,0,1,0}-{2703,6160,0,1,0}-{2710,6154,0,1,0}-{2719,6148,0,1,0}-{2742,6163,0,1,0}-{2744,6150,0,1,0}-{2746,6145,0,1,0}-{2314,2960,0,1,0}-{2723,6105,0,1,0}-{2739,6123,0,1,0}-{2744,6108,0,1,0}-{2326,2894,0,1,0}-{2333,2920,0,1,0}-{3279,5968,0,1,0}-{3286,5962,0,1,0}-{3295,5956,0,1,0}-{3318,5971,0,1,0}-{3320,5958,0,1,0}-{3322,5953,0,1,0}-{2134,5966,0,1,0}-{2141,5992,0,1,0}-{2123,2966,0,1,0}-{2175,2965,0,1,0}-{1910,6014,0,1,0}-{1916,5991,0,1,0}-{2540,3167,0,1,0}-{2110,2955,0,1,0}-{1990,6051,0,1,0}-{2019,6035,0,1,0}-{2447,3467,0,1,0}-{2448,3469,0,1,0}-{1918,6027,0,1,0}-{2275,3161,0,1,0}-{2291,3179,0,1,0}-{2296,3164,0,1,0}-{2113,2859,0,1,0}-{2139,2836,0,1,0}-{2147,2877,0,1,0}-{2165,2816,0,1,0}-{2167,2846,0,1,0}-"
"loc_data": "{2104,2873,0,1,0}-{2102,2942,0,1,0}-{2108,2919,0,1,0}-{2326,2894,0,1,0}-{2333,2920,0,1,0}-{2314,2960,0,1,0}-{2110,2955,0,1,0}-{2322,4566,0,1,0}-{2344,4596,0,1,0}-{2345,4598,0,1,0}-{2348,4566,0,1,0}-{2350,4549,0,1,0}-{2357,4546,0,1,0}-{2359,4589,0,1,0}-{2364,4563,0,1,0}-{2050,5860,0,1,0}-{2056,5930,0,1,0}-{2064,5900,0,1,0}-{2092,5946,0,1,0}-{2086,6028,0,1,0}-{2153,2810,0,1,0}-{2172,2806,0,1,0}-{2113,2859,0,1,0}-{2139,2836,0,1,0}-{2147,2877,0,1,0}-{2165,2816,0,1,0}-{2167,2846,0,1,0}-{2123,2966,0,1,0}-{2175,2965,0,1,0}-{3143,3210,0,1,0}-{3155,3253,0,1,0}-{3163,3261,0,1,0}-{3168,3258,0,1,0}-{1912,5945,0,1,0}-{2134,5966,0,1,0}-{2141,5992,0,1,0}-{1910,6014,0,1,0}-{1916,5991,0,1,0}-{2122,6032,0,1,0}-{1918,6027,0,1,0}-{2180,2798,0,1,0}-{2209,2812,0,1,0}-{2217,2780,0,1,0}-{2182,2979,0,1,0}-{2211,2963,0,1,0}-{2194,3158,0,1,0}-{2216,3188,0,1,0}-{2217,3190,0,1,0}-{2220,3158,0,1,0}-{2222,3141,0,1,0}-{2229,3138,0,1,0}-{2231,3181,0,1,0}-{2236,3155,0,1,0}-{2177,3234,0,1,0}-{2230,3220,0,1,0}-{2231,3234,0,1,0}-{2232,3256,0,1,0}-{2233,3221,0,1,0}-{2233,3223,0,1,0}-{2236,3222,0,1,0}-{2237,3225,0,1,0}-{2238,3205,0,1,0}-{2479,3396,0,1,0}-{2447,3467,0,1,0}-{2448,3469,0,1,0}-{1961,5882,0,1,0}-{1980,5878,0,1,0}-{1921,5931,0,1,0}-{1947,5908,0,1,0}-{1955,5949,0,1,0}-{1973,5888,0,1,0}-{1975,5918,0,1,0}-{3201,5986,0,1,0}-{3254,5972,0,1,0}-{3255,5986,0,1,0}-{3256,6008,0,1,0}-{3257,5973,0,1,0}-{3257,5975,0,1,0}-{3260,5974,0,1,0}-{3261,5977,0,1,0}-{3262,5957,0,1,0}-{1931,6038,0,1,0}-{1983,6037,0,1,0}-{2723,6105,0,1,0}-{2739,6123,0,1,0}-{2744,6108,0,1,0}-{2703,6160,0,1,0}-{2710,6154,0,1,0}-{2719,6148,0,1,0}-{2742,6163,0,1,0}-{2744,6150,0,1,0}-{2746,6145,0,1,0}-{2242,2788,0,1,0}-{2248,2858,0,1,0}-{2256,2828,0,1,0}-{2284,2874,0,1,0}-{2278,2956,0,1,0}-{2540,3167,0,1,0}-{2275,3161,0,1,0}-{2291,3179,0,1,0}-{2296,3164,0,1,0}-{2255,3216,0,1,0}-{2262,3210,0,1,0}-{2271,3204,0,1,0}-{2294,3219,0,1,0}-{2296,3206,0,1,0}-{2298,3201,0,1,0}-{1988,5870,0,1,0}-{2017,5884,0,1,0}-{2025,5852,0,1,0}-{3279,5968,0,1,0}-{3286,5962,0,1,0}-{3295,5956,0,1,0}-{3318,5971,0,1,0}-{3320,5958,0,1,0}-{3322,5953,0,1,0}-{1990,6051,0,1,0}-{2019,6035,0,1,0}-"
},
{
"npc_id": "158",
@ -513,7 +513,7 @@
},
{
"npc_id": "159",
"loc_data": "{2392,3475,0,1,0}-{2394,3506,0,1,0}-{2396,3471,0,1,0}-{2405,3499,0,1,0}-{2416,3487,0,1,0}-{2413,3445,1,1,0}-{2415,3435,1,1,0}-{2416,3416,1,1,0}-{2424,3434,1,1,0}-{2483,3500,1,1,0}-"
"loc_data": "{2413,3445,1,1,0}-{2415,3435,1,1,0}-{2416,3416,1,1,0}-{2424,3434,1,1,0}-{2392,3475,0,1,0}-{2394,3506,0,1,0}-{2396,3471,0,1,0}-{2405,3499,0,1,0}-{2416,3487,0,1,0}-{2483,3500,1,1,0}-"
},
{
"npc_id": "160",
@ -529,11 +529,11 @@
},
{
"npc_id": "163",
"loc_data": "{2451,3414,0,1,0}-{2459,3395,0,1,0}-{2459,3438,0,1,0}-{2462,3395,0,1,0}-{2445,3429,1,1,0}-{2409,3470,1,1,0}-{2416,3466,1,1,0}-{2420,3466,1,1,0}-{2461,9895,0,1,0}-{2465,9894,0,1,0}-{2465,9899,0,1,0}-{2459,3385,0,1,0}-{2463,3385,0,1,0}-{2392,3454,0,1,0}-{2394,3436,0,1,0}-{2408,3452,0,1,0}-{2421,3413,0,1,0}-{2442,3489,0,1,0}-{2450,3485,0,1,0}-{2451,3507,0,1,0}-{2453,3490,0,1,0}-{2459,3503,0,1,0}-{2461,3509,0,1,0}-{2464,3465,0,1,0}-{2464,3468,0,1,0}-{2468,3465,0,1,0}-{2468,3468,0,1,0}-{2468,3506,0,1,0}-{2472,3484,0,1,0}-{2475,3490,0,1,0}-{2475,3502,0,1,0}-{2477,3512,0,1,0}-{2481,3485,0,1,0}-{2482,3501,0,1,0}-{2467,3495,1,1,0}-{2473,3495,1,1,0}-{2448,3497,2,1,0}-{2463,3480,2,1,0}-{2465,3497,2,1,0}-{2465,3510,2,1,0}-{2466,3480,2,1,0}-"
"loc_data": "{2392,3454,0,1,0}-{2394,3436,0,1,0}-{2408,3452,0,1,0}-{2421,3413,0,1,0}-{2409,3470,1,1,0}-{2416,3466,1,1,0}-{2420,3466,1,1,0}-{2459,3385,0,1,0}-{2463,3385,0,1,0}-{2451,3414,0,1,0}-{2459,3395,0,1,0}-{2459,3438,0,1,0}-{2462,3395,0,1,0}-{2445,3429,1,1,0}-{2442,3489,0,1,0}-{2450,3485,0,1,0}-{2451,3507,0,1,0}-{2453,3490,0,1,0}-{2459,3503,0,1,0}-{2461,3509,0,1,0}-{2464,3465,0,1,0}-{2464,3468,0,1,0}-{2468,3465,0,1,0}-{2468,3468,0,1,0}-{2468,3506,0,1,0}-{2472,3484,0,1,0}-{2475,3490,0,1,0}-{2475,3502,0,1,0}-{2477,3512,0,1,0}-{2481,3485,0,1,0}-{2482,3501,0,1,0}-{2467,3495,1,1,0}-{2473,3495,1,1,0}-{2448,3497,2,1,0}-{2463,3480,2,1,0}-{2465,3497,2,1,0}-{2465,3510,2,1,0}-{2466,3480,2,1,0}-{2461,9895,0,1,0}-{2465,9894,0,1,0}-{2465,9899,0,1,0}-"
},
{
"npc_id": "164",
"loc_data": "{2459,3392,0,1,0}-{2461,3422,0,1,0}-{2462,3392,0,1,0}-{2460,3382,0,1,0}-{2462,3382,0,1,0}-{2410,3416,0,1,0}-{2420,3435,0,1,0}-{2420,3447,0,1,0}-{2427,3410,0,1,0}-{2012,5535,2,1,0}-{2023,5544,2,1,0}-{2441,3497,0,1,0}-{2447,3510,0,1,0}-{2461,3487,0,1,0}-{2464,3472,0,1,0}-{2464,3489,0,1,0}-{2467,3489,0,1,0}-{2468,3472,0,1,0}-{2473,3503,0,1,0}-{2478,3497,0,1,0}-{2464,3496,1,1,0}-{2448,3495,2,1,0}-{2460,3487,2,1,0}-{2467,3494,2,1,0}-{2467,3510,2,1,0}-{2471,3496,2,1,0}-{2483,3495,2,1,0}-{2483,3497,2,1,0}-"
"loc_data": "{2410,3416,0,1,0}-{2420,3435,0,1,0}-{2420,3447,0,1,0}-{2427,3410,0,1,0}-{2460,3382,0,1,0}-{2462,3382,0,1,0}-{2459,3392,0,1,0}-{2461,3422,0,1,0}-{2462,3392,0,1,0}-{2441,3497,0,1,0}-{2447,3510,0,1,0}-{2461,3487,0,1,0}-{2464,3472,0,1,0}-{2464,3489,0,1,0}-{2467,3489,0,1,0}-{2468,3472,0,1,0}-{2473,3503,0,1,0}-{2478,3497,0,1,0}-{2464,3496,1,1,0}-{2448,3495,2,1,0}-{2460,3487,2,1,0}-{2467,3494,2,1,0}-{2467,3510,2,1,0}-{2471,3496,2,1,0}-{2483,3495,2,1,0}-{2483,3497,2,1,0}-{2012,5535,2,1,0}-{2023,5544,2,1,0}-"
},
{
"npc_id": "166",
@ -541,11 +541,11 @@
},
{
"npc_id": "168",
"loc_data": "{2434,3436,0,1,0}-{2437,3451,0,1,0}-{2438,3427,0,1,0}-{2441,3411,0,1,0}-{2466,3449,0,1,0}-{2470,3399,0,1,0}-{2472,3400,0,1,0}-{2473,3412,0,1,0}-{2476,3454,0,1,0}-{2482,3397,0,1,0}-{2489,3401,0,1,0}-{2479,3407,1,1,0}-{2379,3482,0,1,0}-{2381,3496,0,1,0}-{2384,3497,0,1,0}-{2391,3476,0,1,0}-{2410,3496,0,1,0}-{2421,3481,0,1,0}-{2397,3514,1,1,0}-{2398,3451,1,1,0}-{2414,3447,1,1,0}-{2438,3465,0,1,0}-{2442,3505,0,1,0}-{2448,3486,0,1,0}-{2449,3487,0,1,0}-{2450,3489,0,1,0}-{2450,3505,0,1,0}-{2454,3465,0,1,0}-{2449,3486,1,1,0}-{2457,3488,1,1,0}-{2476,3488,1,1,0}-{2450,3496,2,1,0}-{2467,3488,2,1,0}-{2470,3503,2,1,0}-{2481,3498,2,1,0}-"
"loc_data": "{2398,3451,1,1,0}-{2414,3447,1,1,0}-{2379,3482,0,1,0}-{2381,3496,0,1,0}-{2384,3497,0,1,0}-{2391,3476,0,1,0}-{2410,3496,0,1,0}-{2421,3481,0,1,0}-{2397,3514,1,1,0}-{2434,3436,0,1,0}-{2437,3451,0,1,0}-{2438,3427,0,1,0}-{2441,3411,0,1,0}-{2466,3449,0,1,0}-{2470,3399,0,1,0}-{2472,3400,0,1,0}-{2473,3412,0,1,0}-{2476,3454,0,1,0}-{2482,3397,0,1,0}-{2489,3401,0,1,0}-{2479,3407,1,1,0}-{2438,3465,0,1,0}-{2442,3505,0,1,0}-{2448,3486,0,1,0}-{2449,3487,0,1,0}-{2450,3489,0,1,0}-{2450,3505,0,1,0}-{2454,3465,0,1,0}-{2449,3486,1,1,0}-{2457,3488,1,1,0}-{2476,3488,1,1,0}-{2450,3496,2,1,0}-{2467,3488,2,1,0}-{2470,3503,2,1,0}-{2481,3498,2,1,0}-"
},
{
"npc_id": "169",
"loc_data": "{2439,3433,0,1,0}-{2441,3449,0,1,0}-{2442,3428,0,1,0}-{2446,3403,0,1,0}-{2450,3416,0,1,0}-{2468,3441,0,1,0}-{2480,3408,0,1,0}-{2480,3406,1,1,0}-{2486,3400,1,1,0}-{2378,3482,0,1,0}-{2383,3496,0,1,0}-{2402,3507,0,1,0}-{2406,3476,0,1,0}-{2422,3485,0,1,0}-{2382,3506,1,1,0}-{2418,3472,1,1,0}-{2392,3450,1,1,0}-{2415,3415,1,1,0}-{2416,3434,1,1,0}-{2423,3425,1,1,0}-{2424,3442,1,1,0}-{2448,3489,0,1,0}-{2450,3488,0,1,0}-{2463,3508,0,1,0}-{2473,3489,0,1,0}-{2474,3457,0,1,0}-{2479,3503,0,1,0}-{2486,3467,0,1,0}-{2437,3463,1,1,0}-{2448,3489,1,1,0}-{2482,3508,1,1,0}-"
"loc_data": "{2392,3450,1,1,0}-{2415,3415,1,1,0}-{2416,3434,1,1,0}-{2423,3425,1,1,0}-{2424,3442,1,1,0}-{2378,3482,0,1,0}-{2383,3496,0,1,0}-{2402,3507,0,1,0}-{2406,3476,0,1,0}-{2422,3485,0,1,0}-{2382,3506,1,1,0}-{2418,3472,1,1,0}-{2439,3433,0,1,0}-{2441,3449,0,1,0}-{2442,3428,0,1,0}-{2446,3403,0,1,0}-{2450,3416,0,1,0}-{2468,3441,0,1,0}-{2480,3408,0,1,0}-{2480,3406,1,1,0}-{2486,3400,1,1,0}-{2448,3489,0,1,0}-{2450,3488,0,1,0}-{2463,3508,0,1,0}-{2473,3489,0,1,0}-{2474,3457,0,1,0}-{2479,3503,0,1,0}-{2486,3467,0,1,0}-{2437,3463,1,1,0}-{2448,3489,1,1,0}-{2482,3508,1,1,0}-"
},
{
"npc_id": "170",
@ -1357,11 +1357,11 @@
},
{
"npc_id": "479",
"loc_data": "{1970,5522,3,1,0}-{2384,3481,0,1,0}-{2388,3473,0,1,0}-{2418,3474,3,1,0}-{2415,3433,3,1,0}-{2466,3500,2,1,0}-"
"loc_data": "{2415,3433,3,1,0}-{2384,3481,0,1,0}-{2388,3473,0,1,0}-{2418,3474,3,1,0}-{2466,3500,2,1,0}-{1970,5522,3,1,0}-"
},
{
"npc_id": "480",
"loc_data": "{1964,5522,3,1,0}-{2458,3417,1,1,0}-{2460,3417,1,1,0}-{2409,3507,0,1,0}-{2412,3474,3,1,0}-{2463,3504,2,1,0}-"
"loc_data": "{2409,3507,0,1,0}-{2412,3474,3,1,0}-{2458,3417,1,1,0}-{2460,3417,1,1,0}-{2463,3504,2,1,0}-{1964,5522,3,1,0}-"
},
{
"npc_id": "481",
@ -1387,6 +1387,10 @@
"npc_id": "490",
"loc_data": "{1887,5026,0,0,6}-"
},
{
"npc_id": "492",
"loc_data": "{2464,3227,0,1,0}-"
},
{
"npc_id": "494",
"loc_data": "{2615,3094,0,0,3}-{2615,3092,0,0,3}-{2615,3092,0,0,3}-{2615,3094,0,0,3}-{3122,3125,0,0,6}-{3120,3125,0,0,6}-{3090,3242,0,0,4}-{3090,3245,0,0,4}-{3090,3243,0,0,4}-{2618,3330,0,0,0}-{2619,3330,0,0,0}-{2584,3422,0,0,4}-{2584,3419,0,0,4}-{2584,3418,0,0,4}-{2657,3283,0,0,3}-{2657,3286,0,0,3}-{2807,3443,0,0,6}-{2810,3443,0,0,6}-"
@ -2433,11 +2437,11 @@
},
{
"npc_id": "839",
"loc_data": "{3265,3066,0,1,0}-{3267,3066,0,1,0}-{3310,3068,0,1,0}-{3322,3011,0,1,0}-{3322,3052,0,1,0}-{3324,3030,0,1,0}-{3150,3044,0,1,0}-{3172,3009,0,1,0}-{3197,3012,0,1,0}-{3198,3040,0,1,0}-{3217,3092,0,1,0}-{3235,3074,0,1,0}-{3252,3125,0,1,0}-{3258,3078,0,1,0}-{3237,2968,0,1,0}-{3224,3013,0,1,0}-{3225,3034,0,1,0}-{3226,3060,0,1,0}-{3250,3057,0,1,0}-{3283,3108,0,1,0}-{3323,3094,0,1,0}-"
"loc_data": "{3150,3044,0,1,0}-{3172,3009,0,1,0}-{3197,3012,0,1,0}-{3198,3040,0,1,0}-{3237,2968,0,1,0}-{3224,3013,0,1,0}-{3225,3034,0,1,0}-{3226,3060,0,1,0}-{3250,3057,0,1,0}-{3217,3092,0,1,0}-{3235,3074,0,1,0}-{3252,3125,0,1,0}-{3258,3078,0,1,0}-{3265,3066,0,1,0}-{3267,3066,0,1,0}-{3310,3068,0,1,0}-{3322,3011,0,1,0}-{3322,3052,0,1,0}-{3324,3030,0,1,0}-{3283,3108,0,1,0}-{3323,3094,0,1,0}-"
},
{
"npc_id": "840",
"loc_data": "{3268,3052,0,1,0}-{3281,3056,0,1,0}-{3307,3055,0,1,0}-{3318,3020,0,1,0}-{3318,3040,0,1,0}-{3190,3054,0,1,0}-{3192,3016,0,1,0}-{3217,3111,0,1,0}-{3222,3086,0,1,0}-{3238,3101,0,1,0}-{3244,3080,0,1,0}-{3253,3116,0,1,0}-{3255,3095,0,1,0}-{3237,3000,0,1,0}-{3245,2960,0,1,0}-{3208,3032,0,1,0}-{3217,3064,0,1,0}-{3238,3015,0,1,0}-{3258,3063,0,1,0}-{3267,3077,0,1,0}-{3269,3110,0,1,0}-{3275,3094,0,1,0}-{3291,3078,0,1,0}-{3291,3100,0,1,0}-{3305,3089,0,1,0}-{3318,3078,0,1,0}-{3321,3104,0,1,0}-"
"loc_data": "{3190,3054,0,1,0}-{3192,3016,0,1,0}-{3237,3000,0,1,0}-{3245,2960,0,1,0}-{3208,3032,0,1,0}-{3217,3064,0,1,0}-{3238,3015,0,1,0}-{3258,3063,0,1,0}-{3217,3111,0,1,0}-{3222,3086,0,1,0}-{3238,3101,0,1,0}-{3244,3080,0,1,0}-{3253,3116,0,1,0}-{3255,3095,0,1,0}-{3268,3052,0,1,0}-{3281,3056,0,1,0}-{3307,3055,0,1,0}-{3318,3020,0,1,0}-{3318,3040,0,1,0}-{3267,3077,0,1,0}-{3269,3110,0,1,0}-{3275,3094,0,1,0}-{3291,3078,0,1,0}-{3291,3100,0,1,0}-{3305,3089,0,1,0}-{3318,3078,0,1,0}-{3321,3104,0,1,0}-"
},
{
"npc_id": "841",
@ -2829,7 +2833,7 @@
},
{
"npc_id": "1043",
"loc_data": "{3726,3381,0,0,0}-{3745,3359,0,0,0}-{3749,3365,0,0,0}-{3750,3354,0,0,0}-{3757,3363,0,0,0}-{3763,3337,0,0,0}-{3459,3457,0,0,0}-{3460,3462,0,0,0}-{3462,3459,0,0,0}-{3463,3490,0,0,0}-{3464,3511,0,0,0}-{3465,3466,0,0,0}-{3466,3495,0,0,0}-{3466,3497,0,0,0}-{3467,3485,0,0,0}-{3467,3497,0,0,0}-{3467,3509,0,0,0}-{3469,3470,0,0,0}-{3470,3469,0,0,0}-{3471,3477,0,0,0}-{3474,3505,0,0,0}-{3476,3507,0,0,0}-{3479,3511,0,0,0}-{3480,3468,0,0,0}-{3480,3470,0,0,0}-{3482,3469,0,0,0}-{3483,3511,0,0,0}-{3484,3464,0,0,0}-{3485,3509,0,0,0}-{3490,3461,0,0,0}-{3491,3460,0,0,0}-{3494,3461,0,0,0}-{3494,3512,0,0,0}-{3498,3461,0,0,0}-{3499,3513,0,0,0}-{3501,3513,0,0,0}-{3502,3464,0,0,0}-{3504,3463,0,0,0}-{3506,3512,0,0,0}-{3506,3515,0,0,0}-{3507,3515,0,0,0}-{3509,3512,0,0,0}-{3511,3488,0,0,0}-{3513,3467,0,0,0}-{3513,3487,0,0,0}-{3513,3489,0,0,0}-{3513,3503,0,0,0}-{3514,3490,0,0,0}-{3515,3495,0,0,0}-{3515,3499,0,0,0}-{3516,3469,0,0,0}-{3409,3369,0,0,0}-{3420,3349,0,0,0}-{3430,3340,0,0,0}-{3435,3330,0,0,0}-{3435,3359,0,0,0}-{3437,3374,0,0,0}-{3446,3385,0,0,0}-{3447,3388,0,0,0}-{3450,3370,0,0,0}-{3450,3387,0,0,0}-{3451,3336,0,0,0}-{3452,3355,0,0,0}-{3726,3289,0,0,0}-{3732,3291,0,0,0}-{3737,3280,0,0,0}-{3745,3285,0,0,0}-{3418,3420,0,0,0}-{3424,3452,0,0,0}-{3428,3409,0,0,0}-{3433,3416,0,0,0}-{3434,3394,0,0,0}-{3436,3407,0,0,0}-{3438,3414,0,0,0}-{3439,3449,0,0,0}-{3446,3439,0,0,0}-{3454,3410,0,0,0}-{3454,3423,0,0,0}-{2852,4561,0,0,0}-{2853,4566,0,0,0}-{2856,4568,0,0,0}-{2864,4561,0,0,0}-{2864,4563,0,0,0}-"
"loc_data": "{2852,4561,0,0,0}-{2853,4566,0,0,0}-{2856,4568,0,0,0}-{2864,4561,0,0,0}-{2864,4563,0,0,0}-{3409,3369,0,0,0}-{3420,3349,0,0,0}-{3430,3340,0,0,0}-{3435,3330,0,0,0}-{3435,3359,0,0,0}-{3437,3374,0,0,0}-{3446,3385,0,0,0}-{3447,3388,0,0,0}-{3450,3370,0,0,0}-{3450,3387,0,0,0}-{3451,3336,0,0,0}-{3452,3355,0,0,0}-{3418,3420,0,0,0}-{3424,3452,0,0,0}-{3428,3409,0,0,0}-{3433,3416,0,0,0}-{3434,3394,0,0,0}-{3436,3407,0,0,0}-{3438,3414,0,0,0}-{3439,3449,0,0,0}-{3446,3439,0,0,0}-{3454,3410,0,0,0}-{3454,3423,0,0,0}-{3726,3289,0,0,0}-{3732,3291,0,0,0}-{3737,3280,0,0,0}-{3745,3285,0,0,0}-{3726,3381,0,0,0}-{3745,3359,0,0,0}-{3749,3365,0,0,0}-{3750,3354,0,0,0}-{3757,3363,0,0,0}-{3763,3337,0,0,0}-{3459,3457,0,0,0}-{3460,3462,0,0,0}-{3462,3459,0,0,0}-{3463,3490,0,0,0}-{3464,3511,0,0,0}-{3465,3466,0,0,0}-{3466,3495,0,0,0}-{3466,3497,0,0,0}-{3467,3485,0,0,0}-{3467,3497,0,0,0}-{3467,3509,0,0,0}-{3469,3470,0,0,0}-{3470,3469,0,0,0}-{3471,3477,0,0,0}-{3474,3505,0,0,0}-{3476,3507,0,0,0}-{3479,3511,0,0,0}-{3480,3468,0,0,0}-{3480,3470,0,0,0}-{3482,3469,0,0,0}-{3483,3511,0,0,0}-{3484,3464,0,0,0}-{3485,3509,0,0,0}-{3490,3461,0,0,0}-{3491,3460,0,0,0}-{3494,3461,0,0,0}-{3494,3512,0,0,0}-{3498,3461,0,0,0}-{3499,3513,0,0,0}-{3501,3513,0,0,0}-{3502,3464,0,0,0}-{3504,3463,0,0,0}-{3506,3512,0,0,0}-{3506,3515,0,0,0}-{3507,3515,0,0,0}-{3509,3512,0,0,0}-{3511,3488,0,0,0}-{3513,3467,0,0,0}-{3513,3487,0,0,0}-{3513,3489,0,0,0}-{3513,3503,0,0,0}-{3514,3490,0,0,0}-{3515,3495,0,0,0}-{3515,3499,0,0,0}-{3516,3469,0,0,0}-"
},
{
"npc_id": "1044",
@ -3345,11 +3349,11 @@
},
{
"npc_id": "1212",
"loc_data": "{2247,3226,0,0,0}-{2249,3227,0,0,0}-{2249,3258,0,0,0}-{2251,3260,0,0,0}-{2259,3211,0,0,0}-{2267,3223,0,0,0}-{2267,3225,0,0,0}-{2298,3262,0,0,0}-{3202,5990,0,0,0}-{3232,5977,0,0,0}-{3234,5969,0,0,0}-{3237,5995,0,0,0}-{3242,5997,0,0,0}-{3244,5995,0,0,0}-{3245,5995,0,0,0}-{2194,3189,0,0,0}-{2196,3187,0,0,0}-{2196,3189,0,0,0}-{2206,3164,0,0,0}-{2209,3164,0,0,0}-{2216,3142,0,0,0}-{2218,3139,0,0,0}-{2178,3238,0,0,0}-{2208,3225,0,0,0}-{2210,3217,0,0,0}-{2213,3243,0,0,0}-{2218,3245,0,0,0}-{2220,3243,0,0,0}-{2221,3243,0,0,0}-{2695,6170,0,0,0}-{2697,6171,0,0,0}-{2697,6202,0,0,0}-{2699,6204,0,0,0}-{2707,6155,0,0,0}-{2715,6167,0,0,0}-{2715,6169,0,0,0}-{2746,6206,0,0,0}-{2729,6086,0,0,0}-{2731,6080,0,0,0}-{2731,6089,0,0,0}-{2744,6139,0,0,0}-{3271,5978,0,0,0}-{3273,5979,0,0,0}-{3273,6010,0,0,0}-{3275,6012,0,0,0}-{3283,5963,0,0,0}-{3291,5975,0,0,0}-{3291,5977,0,0,0}-{3322,6014,0,0,0}-{2281,3142,0,0,0}-{2283,3136,0,0,0}-{2283,3145,0,0,0}-{2296,3195,0,0,0}-"
"loc_data": "{2194,3189,0,0,0}-{2196,3187,0,0,0}-{2196,3189,0,0,0}-{2206,3164,0,0,0}-{2209,3164,0,0,0}-{2216,3142,0,0,0}-{2218,3139,0,0,0}-{2178,3238,0,0,0}-{2208,3225,0,0,0}-{2210,3217,0,0,0}-{2213,3243,0,0,0}-{2218,3245,0,0,0}-{2220,3243,0,0,0}-{2221,3243,0,0,0}-{3202,5990,0,0,0}-{3232,5977,0,0,0}-{3234,5969,0,0,0}-{3237,5995,0,0,0}-{3242,5997,0,0,0}-{3244,5995,0,0,0}-{3245,5995,0,0,0}-{2729,6086,0,0,0}-{2731,6080,0,0,0}-{2731,6089,0,0,0}-{2744,6139,0,0,0}-{2695,6170,0,0,0}-{2697,6171,0,0,0}-{2697,6202,0,0,0}-{2699,6204,0,0,0}-{2707,6155,0,0,0}-{2715,6167,0,0,0}-{2715,6169,0,0,0}-{2746,6206,0,0,0}-{2281,3142,0,0,0}-{2283,3136,0,0,0}-{2283,3145,0,0,0}-{2296,3195,0,0,0}-{2247,3226,0,0,0}-{2249,3227,0,0,0}-{2249,3258,0,0,0}-{2251,3260,0,0,0}-{2259,3211,0,0,0}-{2267,3223,0,0,0}-{2267,3225,0,0,0}-{2298,3262,0,0,0}-{3271,5978,0,0,0}-{3273,5979,0,0,0}-{3273,6010,0,0,0}-{3275,6012,0,0,0}-{3283,5963,0,0,0}-{3291,5975,0,0,0}-{3291,5977,0,0,0}-{3322,6014,0,0,0}-"
},
{
"npc_id": "1213",
"loc_data": "{2248,3225,0,0,0}-{2248,3227,0,0,0}-{2251,3257,0,0,0}-{2253,3259,0,0,0}-{2268,3224,0,0,0}-{2291,3262,0,0,0}-{3204,5988,0,0,0}-{3232,5979,0,0,0}-{3234,5967,0,0,0}-{3234,5976,0,0,0}-{3238,5996,0,0,0}-{3239,5997,0,0,0}-{3243,5996,0,0,0}-{2192,3188,0,0,0}-{2192,3191,0,0,0}-{2194,3190,0,0,0}-{2208,3163,0,0,0}-{2209,3163,0,0,0}-{2216,3136,0,0,0}-{2216,3140,0,0,0}-{2180,3236,0,0,0}-{2208,3227,0,0,0}-{2210,3215,0,0,0}-{2210,3224,0,0,0}-{2214,3244,0,0,0}-{2215,3245,0,0,0}-{2219,3244,0,0,0}-{2696,6169,0,0,0}-{2696,6171,0,0,0}-{2699,6201,0,0,0}-{2701,6203,0,0,0}-{2716,6168,0,0,0}-{2739,6206,0,0,0}-{2730,6084,0,0,0}-{3272,5977,0,0,0}-{3272,5979,0,0,0}-{3275,6009,0,0,0}-{3277,6011,0,0,0}-{3292,5976,0,0,0}-{3315,6014,0,0,0}-{2282,3140,0,0,0}-"
"loc_data": "{2192,3188,0,0,0}-{2192,3191,0,0,0}-{2194,3190,0,0,0}-{2208,3163,0,0,0}-{2209,3163,0,0,0}-{2216,3136,0,0,0}-{2216,3140,0,0,0}-{2180,3236,0,0,0}-{2208,3227,0,0,0}-{2210,3215,0,0,0}-{2210,3224,0,0,0}-{2214,3244,0,0,0}-{2215,3245,0,0,0}-{2219,3244,0,0,0}-{3204,5988,0,0,0}-{3232,5979,0,0,0}-{3234,5967,0,0,0}-{3234,5976,0,0,0}-{3238,5996,0,0,0}-{3239,5997,0,0,0}-{3243,5996,0,0,0}-{2730,6084,0,0,0}-{2696,6169,0,0,0}-{2696,6171,0,0,0}-{2699,6201,0,0,0}-{2701,6203,0,0,0}-{2716,6168,0,0,0}-{2739,6206,0,0,0}-{2282,3140,0,0,0}-{2248,3225,0,0,0}-{2248,3227,0,0,0}-{2251,3257,0,0,0}-{2253,3259,0,0,0}-{2268,3224,0,0,0}-{2291,3262,0,0,0}-{3272,5977,0,0,0}-{3272,5979,0,0,0}-{3275,6009,0,0,0}-{3277,6011,0,0,0}-{3292,5976,0,0,0}-{3315,6014,0,0,0}-"
},
{
"npc_id": "1214",
@ -4061,7 +4065,7 @@
},
{
"npc_id": "1633",
"loc_data": "{1837,3244,0,1,0}-{1836,3250,0,1,0}-{1845,3251,0,1,0}-{1845,3247,0,1,0}-{1849,3241,0,1,0}-{1853,3247,0,1,0}-{1848,3254,0,1,0}-{1858,3251,0,1,0}-{1935,3217,0,1,0}-{1933,3209,0,1,0}-{1930,3208,0,1,0}-{1929,3217,0,1,0}-{1927,3219,0,1,0}-{1924,3211,0,1,0}-{1920,3216,0,1,0}-{1925,3213,0,1,0}-{3263,9399,0,1,3}-{3274,9397,0,1,1}-{3275,9393,0,1,6}-{3271,9384,0,1,0}-{3270,9380,0,1,2}-{3283,9378,0,1,6}-{3285,9386,0,1,5}-{3284,9401,0,1,4}-{3278,9353,0,1,1}-{3299,9380,0,1,1}-{3319,9402,0,1,1}-{3305,9350,0,1,4}-{3248,9374,0,1,3}-{3253,9363,0,1,3}-{3249,9355,0,1,3}-{2761,10007,0,1,0}-{2757,10010,0,1,3}-{2763,10000,0,1,5}-{2760,10011,0,1,0}-{2761,9997,0,1,4}-"
"loc_data": "{1837,3244,0,1,0}-{1836,3250,0,1,0}-{1845,3251,0,1,0}-{1845,3247,0,1,0}-{1849,3241,0,1,0}-{1853,3247,0,1,0}-{1848,3254,0,1,0}-{1858,3251,0,1,0}-{1935,3217,0,1,0}-{1933,3209,0,1,0}-{1930,3208,0,1,0}-{1929,3217,0,1,0}-{1927,3219,0,1,0}-{1924,3211,0,1,0}-{1920,3216,0,1,0}-{1925,3213,0,1,0}-{3263,9399,0,1,3}-{3248,9374,0,1,3}-{3253,9363,0,1,3}-{3249,9355,0,1,3}-{3274,9397,0,1,1}-{3275,9393,0,1,6}-{3271,9384,0,1,0}-{3270,9380,0,1,2}-{3283,9378,0,1,6}-{3285,9386,0,1,5}-{3284,9401,0,1,4}-{3278,9353,0,1,1}-{3299,9380,0,1,1}-{3319,9402,0,1,1}-{3305,9350,0,1,4}-{2761,10007,0,1,0}-{2757,10010,0,1,3}-{2763,10000,0,1,5}-{2760,10011,0,1,0}-{2761,9997,0,1,4}-"
},
{
"npc_id": "1634",
@ -4261,7 +4265,7 @@
},
{
"npc_id": "1752",
"loc_data": "{2437,3442,0,1,0}-{2449,3421,0,1,0}-{2457,3394,0,1,0}-{2464,3394,0,1,0}-{2480,3406,0,1,0}-{2432,3387,0,1,0}-{2442,3388,0,1,0}-{2453,3363,0,1,0}-{2463,3375,0,1,0}-{2381,3428,0,1,0}-{2392,3405,0,1,0}-{2413,3397,0,1,0}-{2415,3408,0,1,0}-{2463,3456,0,1,0}-{2468,3456,0,1,0}-"
"loc_data": "{2381,3428,0,1,0}-{2392,3405,0,1,0}-{2413,3397,0,1,0}-{2415,3408,0,1,0}-{2432,3387,0,1,0}-{2442,3388,0,1,0}-{2453,3363,0,1,0}-{2463,3375,0,1,0}-{2437,3442,0,1,0}-{2449,3421,0,1,0}-{2457,3394,0,1,0}-{2464,3394,0,1,0}-{2480,3406,0,1,0}-{2463,3456,0,1,0}-{2468,3456,0,1,0}-"
},
{
"npc_id": "1754",
@ -4545,7 +4549,7 @@
},
{
"npc_id": "1874",
"loc_data": "{3371,9301,0,1,0}-{3371,9303,0,1,0}-{3371,9305,0,1,0}-{3371,9307,0,1,0}-{3371,9309,0,1,0}-{3373,9301,0,1,0}-{3373,9303,0,1,0}-{3373,9306,0,1,0}-{3373,9308,0,1,0}-{3375,9301,0,1,0}-{3375,9303,0,1,0}-{3375,9305,0,1,0}-{3375,9307,0,1,0}-{3375,9309,0,1,0}-{3403,2963,0,1,0}-{3429,2976,0,1,0}-{3328,2952,0,1,0}-{3328,2957,0,1,0}-{3331,2955,0,1,0}-{3331,2961,0,1,0}-{3266,2955,0,1,0}-{3271,2967,0,1,0}-{3279,2957,0,1,0}-{3280,2975,0,1,0}-{3284,2959,0,1,0}-{3294,2964,0,1,0}-{3295,2978,0,1,0}-{3305,2966,0,1,0}-{3307,2959,0,1,0}-{3309,2973,0,1,0}-{3396,3029,0,1,0}-{3397,3044,0,1,0}-{3398,3038,0,1,0}-"
"loc_data": "{3328,2952,0,1,0}-{3328,2957,0,1,0}-{3331,2955,0,1,0}-{3331,2961,0,1,0}-{3371,9301,0,1,0}-{3371,9303,0,1,0}-{3371,9305,0,1,0}-{3371,9307,0,1,0}-{3371,9309,0,1,0}-{3373,9301,0,1,0}-{3373,9303,0,1,0}-{3373,9306,0,1,0}-{3373,9308,0,1,0}-{3375,9301,0,1,0}-{3375,9303,0,1,0}-{3375,9305,0,1,0}-{3375,9307,0,1,0}-{3375,9309,0,1,0}-{3403,2963,0,1,0}-{3429,2976,0,1,0}-{3396,3029,0,1,0}-{3397,3044,0,1,0}-{3398,3038,0,1,0}-{3266,2955,0,1,0}-{3271,2967,0,1,0}-{3279,2957,0,1,0}-{3280,2975,0,1,0}-{3284,2959,0,1,0}-{3294,2964,0,1,0}-{3295,2978,0,1,0}-{3305,2966,0,1,0}-{3307,2959,0,1,0}-{3309,2973,0,1,0}-"
},
{
"npc_id": "1875",
@ -4705,19 +4709,19 @@
},
{
"npc_id": "1961",
"loc_data": "{3156,5477,0,1,5}-{3162,5479,0,1,4}-{3159,5477,0,1,6}-{3150,5474,0,1,3}-{3147,5480,0,1,1}-{3159,5484,0,1,3}-{2764,4944,1,1,0}-{2796,4976,1,1,0}-{2798,4950,1,1,0}-{2806,4939,1,1,0}-{2832,4959,2,1,0}-{3201,9293,0,1,0}-{3205,9303,0,1,0}-{3206,9328,0,1,0}-{3207,9310,0,1,0}-{3211,9284,0,1,0}-{3220,9289,0,1,0}-{3224,9334,0,1,0}-{3249,9286,0,1,0}-{3251,9303,0,1,0}-{3252,9327,0,1,0}-{3252,9332,0,1,0}-{3255,9315,0,1,0}-{3261,9296,0,1,0}-{3261,9306,0,1,0}-"
"loc_data": "{2832,4959,2,1,0}-{3156,5477,0,1,5}-{3162,5479,0,1,4}-{3159,5477,0,1,6}-{3150,5474,0,1,3}-{3147,5480,0,1,1}-{3159,5484,0,1,3}-{3201,9293,0,1,0}-{3205,9303,0,1,0}-{3206,9328,0,1,0}-{3207,9310,0,1,0}-{3211,9284,0,1,0}-{3220,9289,0,1,0}-{3224,9334,0,1,0}-{3249,9286,0,1,0}-{3251,9303,0,1,0}-{3252,9327,0,1,0}-{3252,9332,0,1,0}-{3255,9315,0,1,0}-{3261,9296,0,1,0}-{3261,9306,0,1,0}-{2764,4944,1,1,0}-{2796,4976,1,1,0}-{2798,4950,1,1,0}-{2806,4939,1,1,0}-"
},
{
"npc_id": "1962",
"loc_data": "{3168,5458,0,1,2}-{2900,4948,3,1,0}-{2762,4962,1,1,0}-{2763,4973,1,1,0}-{2780,4977,1,1,0}-{2787,4967,1,1,0}-{2796,4959,1,1,0}-{2838,4948,2,1,0}-{3205,9329,0,1,0}-{3210,9292,0,1,0}-{3221,9310,0,1,0}-{3225,9323,0,1,0}-{3243,9310,0,1,0}-{3246,9290,0,1,0}-{3255,9301,0,1,0}-{3255,9321,0,1,0}-{3261,9331,0,1,0}-"
"loc_data": "{2838,4948,2,1,0}-{2900,4948,3,1,0}-{3168,5458,0,1,2}-{3205,9329,0,1,0}-{3210,9292,0,1,0}-{3221,9310,0,1,0}-{3225,9323,0,1,0}-{3243,9310,0,1,0}-{3246,9290,0,1,0}-{3255,9301,0,1,0}-{3255,9321,0,1,0}-{3261,9331,0,1,0}-{2762,4962,1,1,0}-{2763,4973,1,1,0}-{2780,4977,1,1,0}-{2787,4967,1,1,0}-{2796,4959,1,1,0}-"
},
{
"npc_id": "1963",
"loc_data": "{3166,5465,0,1,7}-{3168,5462,0,1,0}-{3167,5467,0,1,1}-{3167,5467,0,1,7}-{2926,4965,3,1,0}-{2771,4947,1,1,0}-{2775,4963,1,1,0}-{2781,4948,1,1,0}-{2792,4942,1,1,0}-{2798,4954,1,1,0}-{2858,4964,2,1,0}-{3204,9309,0,1,0}-{3214,9333,0,1,0}-{3219,9297,0,1,0}-{3239,9300,0,1,0}-{3240,9286,0,1,0}-{3240,9330,0,1,0}-{3245,9306,0,1,0}-{3250,9316,0,1,0}-{3250,9317,0,1,0}-{3257,9290,0,1,0}-"
"loc_data": "{2858,4964,2,1,0}-{2926,4965,3,1,0}-{3166,5465,0,1,7}-{3168,5462,0,1,0}-{3167,5467,0,1,1}-{3167,5467,0,1,7}-{3204,9309,0,1,0}-{3214,9333,0,1,0}-{3219,9297,0,1,0}-{3239,9300,0,1,0}-{3240,9286,0,1,0}-{3240,9330,0,1,0}-{3245,9306,0,1,0}-{3250,9316,0,1,0}-{3250,9317,0,1,0}-{3257,9290,0,1,0}-{2771,4947,1,1,0}-{2775,4963,1,1,0}-{2781,4948,1,1,0}-{2792,4942,1,1,0}-{2798,4954,1,1,0}-"
},
{
"npc_id": "1964",
"loc_data": "{2761,4950,1,1,0}-{2765,4938,1,1,0}-{2770,4955,1,1,0}-{2772,4940,1,1,0}-{2777,4943,1,1,0}-{2782,4967,1,1,0}-{2797,4965,1,1,0}-{2799,4937,1,1,0}-{2799,4941,1,1,0}-{2807,4968,1,1,0}-{2808,4975,1,1,0}-{2809,4953,1,1,0}-{2864,4946,2,1,0}-{3202,9283,0,1,0}-{3206,9333,0,1,0}-{3209,9299,0,1,0}-{3219,9301,0,1,0}-{3226,9285,0,1,0}-{3227,9303,0,1,0}-{3228,9293,0,1,0}-{3229,9333,0,1,0}-{3237,9293,0,1,0}-{3246,9321,0,1,0}-{3256,9296,0,1,0}-{3260,9285,0,1,0}-{3262,9317,0,1,0}-"
"loc_data": "{2864,4946,2,1,0}-{3202,9283,0,1,0}-{3206,9333,0,1,0}-{3209,9299,0,1,0}-{3219,9301,0,1,0}-{3226,9285,0,1,0}-{3227,9303,0,1,0}-{3228,9293,0,1,0}-{3229,9333,0,1,0}-{3237,9293,0,1,0}-{3246,9321,0,1,0}-{3256,9296,0,1,0}-{3260,9285,0,1,0}-{3262,9317,0,1,0}-{2761,4950,1,1,0}-{2765,4938,1,1,0}-{2770,4955,1,1,0}-{2772,4940,1,1,0}-{2777,4943,1,1,0}-{2782,4967,1,1,0}-{2797,4965,1,1,0}-{2799,4937,1,1,0}-{2799,4941,1,1,0}-{2807,4968,1,1,0}-{2808,4975,1,1,0}-{2809,4953,1,1,0}-"
},
{
"npc_id": "1970",
@ -4729,7 +4733,7 @@
},
{
"npc_id": "1973",
"loc_data": "{2693,5075,0,1,0}-{2695,5089,0,1,0}-{2697,5096,0,1,0}-{2703,5064,0,1,0}-{2710,5105,0,1,0}-{2719,5078,0,1,0}-{2719,5112,0,1,0}-{2720,5096,0,1,0}-{2726,5086,0,1,0}-{2729,5096,0,1,0}-{2735,5061,0,1,0}-{2740,5069,0,1,0}-{2740,5085,0,1,0}-{2746,5092,0,1,0}-{2746,5114,0,1,0}-{2626,5065,0,1,0}-{2637,5099,0,1,0}-{2638,5058,0,1,0}-{2644,5090,0,1,0}-{2658,5082,0,1,0}-{2666,5097,0,1,0}-{2680,5074,0,1,0}-"
"loc_data": "{2626,5065,0,1,0}-{2637,5099,0,1,0}-{2638,5058,0,1,0}-{2644,5090,0,1,0}-{2658,5082,0,1,0}-{2666,5097,0,1,0}-{2680,5074,0,1,0}-{2693,5075,0,1,0}-{2695,5089,0,1,0}-{2697,5096,0,1,0}-{2703,5064,0,1,0}-{2710,5105,0,1,0}-{2719,5078,0,1,0}-{2719,5112,0,1,0}-{2720,5096,0,1,0}-{2726,5086,0,1,0}-{2729,5096,0,1,0}-{2735,5061,0,1,0}-{2740,5069,0,1,0}-{2740,5085,0,1,0}-{2746,5092,0,1,0}-{2746,5114,0,1,0}-"
},
{
"npc_id": "1976",
@ -4741,11 +4745,11 @@
},
{
"npc_id": "1993",
"loc_data": "{3264,2886,0,1,0}-{3267,2891,0,1,0}-{3268,2881,0,1,0}-{3269,2885,0,1,0}-{3296,2912,0,1,0}-{3297,2919,0,1,0}-{3301,2920,0,1,0}-{3308,2916,0,1,0}-{3258,2868,0,1,0}-{3259,2823,0,1,0}-{3259,2845,0,1,0}-{3260,2830,0,1,0}-{3260,2859,0,1,0}-{3261,2819,0,1,0}-{3261,2851,0,1,0}-{3337,2922,0,1,0}-{3343,2931,0,1,0}-{3349,2922,0,1,0}-{3351,2927,0,1,0}-{3357,2922,0,1,0}-{3359,2927,0,1,0}-{3364,2937,0,1,0}-{3268,2854,0,1,0}-{3269,2827,0,1,0}-{3269,2866,0,1,0}-{3269,2875,0,1,0}-{3270,2818,0,1,0}-{3272,2841,0,1,0}-{3276,2842,0,1,0}-{3282,2839,0,1,0}-{3290,2847,0,1,0}-"
"loc_data": "{3337,2922,0,1,0}-{3343,2931,0,1,0}-{3349,2922,0,1,0}-{3351,2927,0,1,0}-{3357,2922,0,1,0}-{3359,2927,0,1,0}-{3364,2937,0,1,0}-{3258,2868,0,1,0}-{3259,2823,0,1,0}-{3259,2845,0,1,0}-{3260,2830,0,1,0}-{3260,2859,0,1,0}-{3261,2819,0,1,0}-{3261,2851,0,1,0}-{3268,2854,0,1,0}-{3269,2827,0,1,0}-{3269,2866,0,1,0}-{3269,2875,0,1,0}-{3270,2818,0,1,0}-{3272,2841,0,1,0}-{3276,2842,0,1,0}-{3282,2839,0,1,0}-{3290,2847,0,1,0}-{3264,2886,0,1,0}-{3267,2891,0,1,0}-{3268,2881,0,1,0}-{3269,2885,0,1,0}-{3296,2912,0,1,0}-{3297,2919,0,1,0}-{3301,2920,0,1,0}-{3308,2916,0,1,0}-"
},
{
"npc_id": "1994",
"loc_data": "{3265,2931,0,1,0}-{3265,2935,0,1,0}-{3268,2932,0,1,0}-{3268,2935,0,1,0}-{3316,2900,0,1,0}-{3319,2897,0,1,0}-{3320,2901,0,1,0}-{3321,2899,0,1,0}-{3212,2863,0,1,0}-{3213,2866,0,1,0}-{3215,2863,0,1,0}-{3216,2865,0,1,0}-{3216,2868,0,1,0}-{3218,2831,0,1,0}-{3220,2830,0,1,0}-{3220,2833,0,1,0}-{3221,2831,0,1,0}-{3238,2845,0,1,0}-{3240,2845,0,1,0}-{3241,2843,0,1,0}-{3241,2847,0,1,0}-{3400,2997,0,1,0}-{3402,2999,0,1,0}-{3403,2997,0,1,0}-{3445,2993,0,1,0}-{3446,2992,0,1,0}-{3448,2991,0,1,0}-{3448,2994,0,1,0}-{3329,2933,0,1,0}-{3330,2931,0,1,0}-{3331,2933,0,1,0}-{3343,2895,0,1,0}-{3345,2896,0,1,0}-{3346,2894,0,1,0}-{3348,2894,0,1,0}-{3376,2934,0,1,0}-{3378,2933,0,1,0}-{3378,2935,0,1,0}-{3381,2907,0,1,0}-{3383,2905,0,1,0}-{3383,2908,0,1,0}-{3384,2907,0,1,0}-{3306,2817,0,1,0}-{3308,2818,0,1,0}-{3309,2816,0,1,0}-{3312,2817,0,1,0}-{3314,2861,0,1,0}-{3319,2873,0,1,0}-{3321,2871,0,1,0}-{3324,2870,0,1,0}-{3327,2858,0,1,0}-{3406,3014,0,1,0}-{3408,3013,0,1,0}-{3408,3016,0,1,0}-{3410,3015,0,1,0}-"
"loc_data": "{3329,2933,0,1,0}-{3330,2931,0,1,0}-{3331,2933,0,1,0}-{3343,2895,0,1,0}-{3345,2896,0,1,0}-{3346,2894,0,1,0}-{3348,2894,0,1,0}-{3376,2934,0,1,0}-{3378,2933,0,1,0}-{3378,2935,0,1,0}-{3381,2907,0,1,0}-{3383,2905,0,1,0}-{3383,2908,0,1,0}-{3384,2907,0,1,0}-{3400,2997,0,1,0}-{3402,2999,0,1,0}-{3403,2997,0,1,0}-{3445,2993,0,1,0}-{3446,2992,0,1,0}-{3448,2991,0,1,0}-{3448,2994,0,1,0}-{3406,3014,0,1,0}-{3408,3013,0,1,0}-{3408,3016,0,1,0}-{3410,3015,0,1,0}-{3212,2863,0,1,0}-{3213,2866,0,1,0}-{3215,2863,0,1,0}-{3216,2865,0,1,0}-{3216,2868,0,1,0}-{3218,2831,0,1,0}-{3220,2830,0,1,0}-{3220,2833,0,1,0}-{3221,2831,0,1,0}-{3238,2845,0,1,0}-{3240,2845,0,1,0}-{3241,2843,0,1,0}-{3241,2847,0,1,0}-{3306,2817,0,1,0}-{3308,2818,0,1,0}-{3309,2816,0,1,0}-{3312,2817,0,1,0}-{3314,2861,0,1,0}-{3319,2873,0,1,0}-{3321,2871,0,1,0}-{3324,2870,0,1,0}-{3327,2858,0,1,0}-{3265,2931,0,1,0}-{3265,2935,0,1,0}-{3268,2932,0,1,0}-{3268,2935,0,1,0}-{3316,2900,0,1,0}-{3319,2897,0,1,0}-{3320,2901,0,1,0}-{3321,2899,0,1,0}-"
},
{
"npc_id": "1995",
@ -4897,7 +4901,7 @@
},
{
"npc_id": "2057",
"loc_data": "{2442,9436,2,1,0}-{2458,9413,2,1,0}-{2470,9435,2,1,0}-{2472,9460,2,1,0}-{2483,9413,2,1,0}-{2485,9447,2,1,0}-{2480,3046,0,1,0}-{2453,9393,2,1,0}-{2461,9403,2,1,0}-{2464,9380,2,1,0}-"
"loc_data": "{2480,3046,0,1,0}-{2453,9393,2,1,0}-{2461,9403,2,1,0}-{2464,9380,2,1,0}-{2442,9436,2,1,0}-{2458,9413,2,1,0}-{2470,9435,2,1,0}-{2472,9460,2,1,0}-{2483,9413,2,1,0}-{2485,9447,2,1,0}-"
},
{
"npc_id": "2058",
@ -6317,7 +6321,7 @@
},
{
"npc_id": "2803",
"loc_data": "{3387,3068,0,1,0}-{3387,3017,0,1,0}-{3404,3062,0,1,0}-{3441,3061,0,1,0}-{3445,3034,0,1,0}-{3338,2804,0,1,0}-{3339,2815,0,1,0}-{3342,2809,0,1,0}-{3344,2800,0,1,0}-{3348,2809,0,1,0}-{3349,2814,0,1,0}-{3357,2813,0,1,0}-{3357,2806,0,1,0}-{3365,2815,0,1,0}-"
"loc_data": "{3338,2804,0,1,0}-{3339,2815,0,1,0}-{3342,2809,0,1,0}-{3344,2800,0,1,0}-{3348,2809,0,1,0}-{3349,2814,0,1,0}-{3357,2813,0,1,0}-{3357,2806,0,1,0}-{3365,2815,0,1,0}-{3387,3068,0,1,0}-{3387,3017,0,1,0}-{3404,3062,0,1,0}-{3441,3061,0,1,0}-{3445,3034,0,1,0}-"
},
{
"npc_id": "2804",
@ -7237,7 +7241,7 @@
},
{
"npc_id": "3675",
"loc_data": "{3333,2864,0,1,1}-{3335,2860,0,1,2}-{3338,2864,0,1,4}-{3215,2841,0,1,0}-{3217,2845,0,1,0}-{3220,2841,0,1,0}-{3295,2866,0,1,0}-{3297,2863,0,1,0}-{3301,2864,0,1,0}-{3336,2778,0,1,0}-{3343,2793,0,1,0}-{3367,2791,0,1,0}-"
"loc_data": "{3336,2778,0,1,0}-{3343,2793,0,1,0}-{3367,2791,0,1,0}-{3333,2864,0,1,1}-{3335,2860,0,1,2}-{3338,2864,0,1,4}-{3215,2841,0,1,0}-{3217,2845,0,1,0}-{3220,2841,0,1,0}-{3295,2866,0,1,0}-{3297,2863,0,1,0}-{3301,2864,0,1,0}-"
},
{
"npc_id": "3677",
@ -8245,19 +8249,19 @@
},
{
"npc_id": "4690",
"loc_data": "{2372,3401,0,1,0}-{3104,3875,0,1,2}-{2912,9731,0,1,0}-{3256,3624,0,1,5}-{3308,3661,0,1,2}-"
"loc_data": "{3104,3875,0,1,2}-{2372,3401,0,1,0}-{2912,9731,0,1,0}-{3256,3624,0,1,5}-{3308,3661,0,1,2}-"
},
{
"npc_id": "4691",
"loc_data": "{2371,3398,0,1,0}-{3110,3854,0,1,0}-"
"loc_data": "{3110,3854,0,1,0}-{2371,3398,0,1,0}-"
},
{
"npc_id": "4692",
"loc_data": "{2372,3395,0,1,0}-{3116,3858,0,1,0}-"
"loc_data": "{3116,3858,0,1,0}-{2372,3395,0,1,0}-"
},
{
"npc_id": "4693",
"loc_data": "{2369,3394,0,1,0}-{3094,3849,0,1,0}-{2912,9741,0,1,0}-{2906,9736,0,1,0}-"
"loc_data": "{3094,3849,0,1,0}-{2369,3394,0,1,0}-{2912,9741,0,1,0}-{2906,9736,0,1,0}-"
},
{
"npc_id": "4694",
@ -9009,7 +9013,7 @@
},
{
"npc_id": "5359",
"loc_data": "{2693,5065,0,1,0}-{2693,5089,0,1,0}-{2704,5091,0,1,0}-{2710,5095,0,1,0}-{2712,5076,0,1,0}-{2714,5108,0,1,0}-{2716,5092,0,1,0}-{2719,5071,0,1,0}-{2722,5061,0,1,0}-{2732,5087,0,1,0}-{2739,5078,0,1,0}-{2740,5104,0,1,0}-{2747,5083,0,1,0}-{2627,5093,0,1,0}-{2629,5061,0,1,0}-{2638,5090,0,1,0}-{2651,5105,0,1,0}-{2654,5079,0,1,0}-{2663,5116,0,1,0}-{2683,5059,0,1,0}-{2685,5111,0,1,0}-"
"loc_data": "{2627,5093,0,1,0}-{2629,5061,0,1,0}-{2638,5090,0,1,0}-{2651,5105,0,1,0}-{2654,5079,0,1,0}-{2663,5116,0,1,0}-{2683,5059,0,1,0}-{2685,5111,0,1,0}-{2693,5065,0,1,0}-{2693,5089,0,1,0}-{2704,5091,0,1,0}-{2710,5095,0,1,0}-{2712,5076,0,1,0}-{2714,5108,0,1,0}-{2716,5092,0,1,0}-{2719,5071,0,1,0}-{2722,5061,0,1,0}-{2732,5087,0,1,0}-{2739,5078,0,1,0}-{2740,5104,0,1,0}-{2747,5083,0,1,0}-"
},
{
"npc_id": "5361",
@ -10293,11 +10297,11 @@
},
{
"npc_id": "6050",
"loc_data": "{3264,3008,0,1,0}-{3266,3008,0,1,0}-{3285,3066,0,1,0}-{3322,3032,0,1,0}-{3323,3055,0,1,0}-{3325,3010,0,1,0}-{3174,3010,0,1,0}-{3198,3061,0,1,0}-{3199,3016,0,1,0}-{3219,3125,0,1,0}-{3233,3075,0,1,0}-{3250,3126,0,1,0}-{3223,3011,0,1,0}-{3228,3060,0,1,0}-{3251,3059,0,1,0}-{3310,3076,0,1,0}-"
"loc_data": "{3174,3010,0,1,0}-{3198,3061,0,1,0}-{3199,3016,0,1,0}-{3223,3011,0,1,0}-{3228,3060,0,1,0}-{3251,3059,0,1,0}-{3219,3125,0,1,0}-{3233,3075,0,1,0}-{3250,3126,0,1,0}-{3264,3008,0,1,0}-{3266,3008,0,1,0}-{3285,3066,0,1,0}-{3322,3032,0,1,0}-{3323,3055,0,1,0}-{3325,3010,0,1,0}-{3310,3076,0,1,0}-"
},
{
"npc_id": "6051",
"loc_data": "{3266,3010,0,1,0}-{3267,3068,0,1,0}-{3287,3065,0,1,0}-{3287,3067,0,1,0}-{3310,3070,0,1,0}-{3312,3068,0,1,0}-{3320,3054,0,1,0}-{3324,3013,0,1,0}-{3325,3033,0,1,0}-{3153,3047,0,1,0}-{3196,3063,0,1,0}-{3199,3036,0,1,0}-{3215,3092,0,1,0}-{3217,3124,0,1,0}-{3260,3077,0,1,0}-{3223,3035,0,1,0}-{3225,3011,0,1,0}-{3283,3084,0,1,0}-"
"loc_data": "{3153,3047,0,1,0}-{3196,3063,0,1,0}-{3199,3036,0,1,0}-{3223,3035,0,1,0}-{3225,3011,0,1,0}-{3215,3092,0,1,0}-{3217,3124,0,1,0}-{3260,3077,0,1,0}-{3266,3010,0,1,0}-{3267,3068,0,1,0}-{3287,3065,0,1,0}-{3287,3067,0,1,0}-{3310,3070,0,1,0}-{3312,3068,0,1,0}-{3320,3054,0,1,0}-{3324,3013,0,1,0}-{3325,3033,0,1,0}-{3283,3084,0,1,0}-"
},
{
"npc_id": "6052",
@ -10423,6 +10427,38 @@
"npc_id": "6117",
"loc_data": "{1884,5020,0,0,6}-"
},
{
"npc_id": "6118",
"loc_data": "{2443,3190,0,0,6}-"
},
{
"npc_id": "6119",
"loc_data": "{2439,3186,0,1,4}-"
},
{
"npc_id": "6120",
"loc_data": "{2437,3160,1,1,4}-"
},
{
"npc_id": "6122",
"loc_data": "{2327,9394,0,0,1}-"
},
{
"npc_id": "6123",
"loc_data": "{2364,9399,0,0,1}-"
},
{
"npc_id": "6124",
"loc_data": "{2364,9398,0,0,1}-"
},
{
"npc_id": "6125",
"loc_data": "{2323,9377,0,1,0}-"
},
{
"npc_id": "6126",
"loc_data": "{2351,9358,0,1,0}-"
},
{
"npc_id": "6127",
"loc_data": "{2467,3183,0,0,3}-"
@ -12139,10 +12175,6 @@
"npc_id": "7804",
"loc_data": "{3279,4350,0,1,0}-{3294,4353,0,1,0}-{3294,4366,0,1,0}-"
},
{
"npc_id": "7823",
"loc_data": ""
},
{
"npc_id": "7891",
"loc_data": "{3207,3250,0,0,0}-{3208,3250,0,0,0}-{3209,3250,0,0,0}-"
@ -12305,7 +12337,7 @@
},
{
"npc_id": "8324",
"loc_data": "{2911,3811,0,1,0}-{2911,3812,0,1,0}-{2911,3813,0,1,0}-{2925,3821,0,1,0}-{2925,3822,0,1,0}-{2925,3823,0,1,0}-{2929,3798,0,1,0}-{2936,3790,0,1,0}-{2936,3810,0,1,0}-{2939,3823,0,1,0}-{2949,3819,1,1,0}-{2949,3822,1,1,0}-{2955,3822,1,1,0}-{2957,3822,1,1,0}-{3016,9977,1,1,0}-{3021,9939,1,1,0}-{3024,9954,1,1,0}-{3025,9943,1,1,0}-{3025,9954,1,1,0}-{3026,9966,1,1,0}-{3032,9952,1,1,0}-{3039,9954,1,1,0}-{3044,9967,1,1,0}-{3044,9971,1,1,0}-{3057,9936,1,1,0}-{3059,9953,1,1,0}-{3041,9975,2,1,0}-{3043,9975,2,1,0}-{3045,9975,2,1,0}-{3016,10022,2,1,0}-{3017,10039,2,1,0}-{3027,10028,2,1,0}-{3029,10013,2,1,0}-{3036,10038,2,1,0}-{3037,10006,2,1,0}-{3041,10024,2,1,0}-{3043,10032,2,1,0}-{3057,10002,2,1,0}-{3058,10021,2,1,0}-{3065,10006,2,1,0}-{3027,10092,1,1,0}-{3035,10097,1,1,0}-{3051,10099,1,1,0}-{3427,5102,0,1,0}-{3428,5099,0,1,0}-{3428,5102,0,1,0}-{3430,5099,0,1,0}-"
"loc_data": "{2911,3811,0,1,0}-{2911,3812,0,1,0}-{2911,3813,0,1,0}-{2925,3821,0,1,0}-{2925,3822,0,1,0}-{2925,3823,0,1,0}-{2929,3798,0,1,0}-{2936,3790,0,1,0}-{2936,3810,0,1,0}-{2939,3823,0,1,0}-{3427,5102,0,1,0}-{3428,5099,0,1,0}-{3428,5102,0,1,0}-{3430,5099,0,1,0}-{2949,3819,1,1,0}-{2949,3822,1,1,0}-{2955,3822,1,1,0}-{2957,3822,1,1,0}-{3016,9977,1,1,0}-{3021,9939,1,1,0}-{3024,9954,1,1,0}-{3025,9943,1,1,0}-{3025,9954,1,1,0}-{3026,9966,1,1,0}-{3032,9952,1,1,0}-{3039,9954,1,1,0}-{3044,9967,1,1,0}-{3044,9971,1,1,0}-{3057,9936,1,1,0}-{3059,9953,1,1,0}-{3041,9975,2,1,0}-{3043,9975,2,1,0}-{3045,9975,2,1,0}-{3016,10022,2,1,0}-{3017,10039,2,1,0}-{3027,10028,2,1,0}-{3029,10013,2,1,0}-{3036,10038,2,1,0}-{3037,10006,2,1,0}-{3041,10024,2,1,0}-{3043,10032,2,1,0}-{3057,10002,2,1,0}-{3058,10021,2,1,0}-{3065,10006,2,1,0}-{3027,10092,1,1,0}-{3035,10097,1,1,0}-{3051,10099,1,1,0}-"
},
{
"npc_id": "8328",

View file

@ -70,7 +70,7 @@ class ChampionScrollsDropHandler : ChampionScrollsEventHookBase() {
NPCs.CAVE_GOBLIN_GUARD_2073, NPCs.CAVE_GOBLIN_GUARD_2074,
NPCs.GOBLIN_GUARD_489, NPCs.GOBLIN_GUARD_6496, NPCs.GOBLIN_GUARD_6497,
NPCs.GOBLIN_GUARD_6496, NPCs.GOBLIN_GUARD_6497,
NPCs.SERGEANT_GRIMSPIKE_6265,
NPCs.SERGEANT_STEELWILL_6263,
NPCs.SERGEANT_STRONGSTACK_6261

View file

@ -15,7 +15,7 @@ public final class GuardNPC extends AbstractNPC {
/**
* The NPC ids of NPCs using this plugin.
*/
private static final int[] ID = { 9, 32, 163, 164, 196, 197, 206, 253, 254, 255, 256, 274, 275, 296, 298, 299, 447, 448, 449, 489, 609, 678, 799, 837, 842, 862, 870, 877, 917, 1200, 1203, 1204, 1317, 1710, 1711, 1712, 2073, 2074, 2134, 2135, 2136, 2236, 2571, 2699, 2700, 2701, 2702, 2703, 3228, 3229, 3230, 3231, 3232, 3233, 3241, 3407, 3408, 3715, 4257, 4258, 4259, 4260, 4307, 4308, 4309, 4310, 4311, 4336, 4375, 4603, 4604, 4605, 4606, 5800, 5801, 5919, 5920 };
private static final int[] ID = { 9, 32, 163, 164, 196, 197, 206, 253, 254, 255, 256, 274, 275, 296, 298, 299, 447, 448, 449, 609, 678, 799, 837, 842, 862, 870, 877, 917, 1200, 1203, 1204, 1317, 1710, 1711, 1712, 2073, 2074, 2134, 2135, 2136, 2236, 2571, 2699, 2700, 2701, 2702, 2703, 3228, 3229, 3230, 3231, 3232, 3233, 3241, 3407, 3408, 3715, 4257, 4258, 4259, 4260, 4307, 4308, 4309, 4310, 4311, 4336, 4375, 4603, 4604, 4605, 4606, 5800, 5801, 5919, 5920 };
/**
* Constructs a new {@code GuardNPC} {@code Object}.

View file

@ -27,7 +27,7 @@ enum class SilverProduct(
val strungId: Int
) {
HOLY(BUTTON_UNBLESSED, Items.HOLY_MOULD_1599, Items.UNSTRUNG_SYMBOL_1714, 1, 16, 50.0, Items.UNBLESSED_SYMBOL_1716),
UNHOLY(BUTTON_UNHOLY, Items.UNHOLY_MOULD_1594, Items.UNSTRUNG_EMBLEM_1720, 1, 17, 50.0, Items.UNHOLY_SYMBOL_1724),
UNHOLY(BUTTON_UNHOLY, Items.UNHOLY_MOULD_1594, Items.UNSTRUNG_EMBLEM_1720, 1, 17, 50.0, Items.UNPOWERED_SYMBOL_1722),
SICKLE(BUTTON_SICKLE, Items.SICKLE_MOULD_2976, Items.SILVER_SICKLE_2961, 1, 18, 50.0, -1),
TIARA(BUTTON_TIARA, Items.TIARA_MOULD_5523, Items.TIARA_5525, 1, 23, 52.5, -1),
SILVTHRIL_CHAIN(BUTTON_SILVTHRIL_CHAIN, Items.CHAIN_LINK_MOULD_13153, Items.SILVTHRIL_CHAIN_13154, 1, 47, 100.0, -1),

View file

@ -1,130 +0,0 @@
package content.region.kandarin.dialogue
import content.global.handlers.iface.BookInterface
import content.global.handlers.iface.BookLine
import content.global.handlers.iface.Page
import content.global.handlers.iface.PageSet
import core.ServerConstants
import core.api.setAttribute
import core.game.interaction.IntType
import core.game.interaction.InteractionListener
import core.game.node.entity.player.Player
import core.plugin.Initializable
import org.rs09.consts.Items
@Initializable
class AstronomyBook : InteractionListener {
companion object {
private val TITLE = "The tales of Scorpius"
private val CONTENTS = arrayOf(
PageSet(
Page(
BookLine("A History of Astronomy", 55),
BookLine("in ${ServerConstants.SERVER_NAME}.", 56),
BookLine("", 57),
BookLine("At the start of the 4th age,", 58),
BookLine("a learned man by the", 59),
BookLine("name of Scorpius, known well", 60),
BookLine("for his powers of vision and", 61),
BookLine("magic, sought communion with", 62),
BookLine("the gods of the world.", 63),
BookLine("So many unanswered questions", 64),
BookLine("had he that devoted his entire", 65),
),
Page(
BookLine("life to this cause.", 66),
BookLine("After many years of study,", 67),
BookLine("seeking knowledge from the", 68),
BookLine("wise of that time, he developed", 69),
BookLine("a machine infused with", 70),
BookLine("magical power, infused with", 71),
BookLine("the ability to pierce", 72),
BookLine("into the heavens - a huge eye", 73),
BookLine("that gave the user", 74),
BookLine("incredible site, like never", 75),
BookLine("seen before.", 76),
)
),
PageSet(
Page(
BookLine("As time passed, Scorpius", 55),
BookLine("grew adept at using his", 56),
BookLine("specialized skills, and followed", 57),
BookLine("the movements of stars", 58),
BookLine("in ${ServerConstants.SERVER_NAME}, which are", 59),
BookLine("mapped and named, and still", 60),
BookLine("used to this day.", 61),
BookLine("", 62),
BookLine("Before long, Scorpius", 63),
BookLine("used his knowledge", 64),
BookLine("for predicting the future,", 65),
),
Page(
BookLine("and, in turn, he called upon", 66),
BookLine("the dark knowledge of", 67),
BookLine("Zamorakian worshipers", 68),
BookLine("to further his cause. Living", 69),
BookLine("underground, the followers", 70),
BookLine("of the dark god remained", 71),
BookLine("until the civilization of", 72),
BookLine("Ardougne grew in strength", 73),
BookLine("and control.", 74),
)
),
PageSet(
Page(
BookLine("The kings of that time", 55),
BookLine("worked to banish the", 56),
BookLine("Zamorakian followers in", 57),
BookLine("the area, hiding all", 58),
BookLine("reference to Scorpius's", 59),
BookLine("invention, due to", 60),
BookLine("its 'evil nature'.", 61),
BookLine("", 62),
BookLine("Years later, when the", 63),
BookLine("minds of the kings lent", 64),
BookLine("more towards the research", 65),
),
Page(
BookLine("of the unknown, the plans", 66),
BookLine("of Scorpius were uncovered", 67),
BookLine("and the heavenly eye", 68),
BookLine("constructed again. Since then,", 69),
BookLine("many have studied the ways of", 70),
BookLine("the astronomer, Scorpius", 71),
BookLine("and in his memory a grave", 72),
BookLine("was constructed near the", 73),
BookLine("Observatory. Some claim his", 74),
BookLine("ghost still wanders nearby,", 75),
BookLine("in torment as he seeks", 76),
)
),
PageSet(
Page(
BookLine("the secrets of the heavens", 55),
BookLine("that can never be solved.", 56),
BookLine("Tales tell that he will", 57),
BookLine("grant those adept in the", 58),
BookLine("arts of the astronomer a", 59),
BookLine("blessing of unusual power.", 60),
BookLine("", 61),
BookLine("Here ends the tale of", 62),
BookLine("how astronomy entered", 63),
BookLine("the known world.", 64),
)
),
)
}
private fun display(player: Player, pageNum: Int, buttonID: Int): Boolean {
BookInterface.pageSetup(player, BookInterface.FANCY_BOOK_3_49, TITLE, CONTENTS)
return true
}
override fun defineListeners() {
on(Items.ASTRONOMY_BOOK_600, IntType.ITEM, "read") { player, _ ->
BookInterface.openBook(player, BookInterface.FANCY_BOOK_3_49, ::display)
return@on true
}
}
}

View file

@ -0,0 +1,169 @@
package content.region.kandarin.quest.observatoryquest
import content.global.handlers.iface.*
import core.ServerConstants
import core.game.interaction.IntType
import core.game.interaction.InteractionListener
import core.game.node.entity.player.Player
import org.rs09.consts.Items
/**
* Astronomy Book
*/
class AstronomyBook : InteractionListener {
companion object {
private const val TITLE = "THE TALE OF SCORPIUS"
private val CONTENTS = arrayOf(
PageSet(
Page(
BookLine("THE TALE OF", 55),
BookLine("SCORPIUS: ", 56),
BookLine("", 57),
BookLine("A History of Astronomy", 58),
BookLine("in ${ServerConstants.SERVER_NAME}.", 59),
BookLine("", 60),
BookLine("At the start of the 4th", 61),
BookLine("Age, a learned man by", 62),
BookLine("the name of Scorpius,", 63),
BookLine("known well for his powers", 64),
BookLine("of vision and magic,", 65),
),
Page(
BookLine("sought communion with", 66),
BookLine("the gods of the world. So", 67),
BookLine("many unanswered", 68),
BookLine("questions had he that he", 69),
BookLine("devoted his entire lif to", 70),
BookLine("the cause.", 71),
BookLine("", 72),
BookLine("After many years of", 73),
BookLine("study, seeking knowledge", 74),
BookLine("from the wise of that", 75),
BookLine("time, he developed a", 76),
)
),
PageSet(
Page(
BookLine("machine infused with", 55),
BookLine("magical power, infused", 56),
BookLine("with the ability to pierce", 57),
BookLine("into the very heavens - a", 58),
BookLine("huge eye that gave the", 59),
BookLine("user incredible sight, like", 60),
BookLine("never before.", 61),
BookLine("", 62),
BookLine("", 63),
BookLine("", 64),
BookLine("", 65),
),
Page(
BookLine("As time passed, Scorpius", 66),
BookLine("grew adept at using his", 67),
BookLine("specialized skills, and", 68),
BookLine("followed the movements of", 69),
BookLine("the stars in ${ServerConstants.SERVER_NAME}", 70),
BookLine("which he mapped and", 71),
BookLine("named, and are still used", 72),
BookLine("to this very day.", 73),
BookLine("", 74),
BookLine("Before long, Scorpius", 75),
BookLine("used his knowledge for", 76),
)
),
PageSet(
Page(
BookLine("predicting the future,", 55),
BookLine("and, in turn, he called", 56),
BookLine("upon the dark knowledge", 57),
BookLine("of Zamorakian", 58),
BookLine("worshippers to further his", 59),
BookLine("cause. Living below", 60),
BookLine("ground, the followers of", 61),
BookLine("the dark god remained", 62),
BookLine("until the civilisation of", 63),
BookLine("Ardougne grew in", 64),
BookLine("strength and control.", 65),
),
Page(
BookLine("", 66),
BookLine("", 67),
BookLine("", 68),
BookLine("", 69),
BookLine("", 70),
BookLine("", 71),
BookLine("The kings of that time", 72),
BookLine("worked to banish the", 73),
BookLine("Zamorakian followers in", 74),
BookLine("the area, hiding all", 75),
BookLine("references to Scorpius's", 76),
)
),
PageSet(
Page(
BookLine("invention, due to its 'evil", 55),
BookLine("nature'.", 56),
BookLine("", 57),
BookLine("Years after, when the", 58),
BookLine("minds of the kings lent", 59),
BookLine("more towards the", 60),
BookLine("research of the unknown,", 61),
BookLine("the plans of Scorpius", 62),
BookLine("were uncovered and the", 63),
BookLine("heavenly eye constructed", 64),
BookLine("again.", 65),
),
Page(
BookLine("Since then, many have", 66),
BookLine("studied the ways of the", 67),
BookLine("astronomer, Scorpius, and", 68),
BookLine("in his memory a grave", 69),
BookLine("was constructed near the", 70),
BookLine("Observatory.", 71),
BookLine("", 72),
BookLine("", 73),
BookLine("", 74),
BookLine("", 75),
BookLine("", 76),
)
),
PageSet(
Page(),
Page(
BookLine("Some claim his ghost still", 66),
BookLine("wanders nearby, in", 67),
BookLine("torment as he seeks the", 68),
BookLine("secrets of the heavens", 69),
BookLine("that can never be solved.", 70),
BookLine("Tales tell that he will", 71),
BookLine("grant those adept in the", 72),
BookLine("arts of the astronomer a", 73),
BookLine("blessing of unusual", 74),
BookLine("power.", 75),
BookLine("", 76),
)
),
PageSet(
Page(
BookLine("Here ends the tale of how", 55),
BookLine("astronomy entered the", 56),
BookLine("known world.", 57),
),
Page()
),
)
private fun display(player:Player, pageNum: Int, buttonID: Int) : Boolean {
BookInterface.pageSetup(player, BookInterface.FANCY_BOOK_3_49, TITLE, CONTENTS)
BookInterface.setModelOnPage(player,2, 27071, BookInterface.FANCY_BOOK_3_49, 33, 34, 1020, 0, 0)
BookInterface.setModelOnPage(player,4, 27069, BookInterface.FANCY_BOOK_3_49, 17, 18, 1224, 0, 0)
return true
}
}
override fun defineListeners() {
on(Items.ASTRONOMY_BOOK_600, IntType.ITEM, "read") { player, _ ->
BookInterface.openBook(player, BookInterface.FANCY_BOOK_3_49, ::display)
return@on true
}
}
}

View file

@ -0,0 +1,152 @@
package content.region.kandarin.quest.observatoryquest
import core.api.*
import core.game.dialogue.*
import core.game.interaction.InteractionListener
import core.game.node.entity.npc.AbstractNPC
import core.game.node.entity.npc.NPC
import core.game.world.map.Location
import core.plugin.Initializable
import core.tools.RandomFunction
import org.rs09.consts.NPCs
class GoblinDialogues : InteractionListener {
override fun defineListeners() {
on(NPCs.GREASYCHEEKS_6127, NPC, "talk-to") { player, node ->
openDialogue(player, GreasycheeksDialogueFile(), node as NPC)
return@on true
}
on(NPCs.SMELLYTOES_6128, NPC, "talk-to") { player, node ->
openDialogue(player, SmellytoesDialogueFile(), node as NPC)
return@on true
}
on(NPCs.CREAKYKNEES_6129, NPC, "talk-to") { player, node ->
openDialogue(player, CreakykneesDialogueFile(), node as NPC)
return@on true
}
}
}
class GreasycheeksDialogueFile : DialogueLabeller() {
override fun addConversation() {
assignToIds(NPCs.GREASYCHEEKS_6127)
player("Hello.")
npc(ChatAnim.OLD_NORMAL, "Shush! I'm concentrating.")
player("Oh, sorry.")
}
}
class SmellytoesDialogueFile : DialogueLabeller() {
override fun addConversation() {
assignToIds(NPCs.SMELLYTOES_6128)
player("Hi there.")
npc(ChatAnim.OLD_NORMAL, "Hey, ids me matesh!")
player("Sorry, have we met?")
npc(ChatAnim.OLD_NORMAL, "Yeah! you wazsh wiv me in dat pub overy by hill!")
player("I have no idea what you're going on about.")
npc(ChatAnim.OLD_NORMAL, "Glad yeeash remembers.")
}
}
class CreakykneesDialogueFile : DialogueLabeller() {
override fun addConversation() {
assignToIds(NPCs.CREAKYKNEES_6129)
player("Where did you get that lens?")
npc(ChatAnim.OLD_NORMAL, "From that strange metal thing up on the hill.")
player(ChatAnim.ANGRY, "You should give that back!")
npc(ChatAnim.OLD_NORMAL, "Even if it's cracked?")
player("Ah, well, I suppose it's of no use. But, still.")
}
}
@Initializable
class GreasycheeksNPC(id: Int = 0, location: Location? = null) : AbstractNPC(id, location) {
override fun construct(id: Int, location: Location?, vararg objects: Any?): AbstractNPC {
return GreasycheeksNPC(id, location)
}
override fun getIds(): IntArray {
return intArrayOf(NPCs.GREASYCHEEKS_6127)
}
override fun handleTickActions() {
super.handleTickActions()
if (RandomFunction.roll(12)) {
sendChat(this, arrayOf(
"Cook, cook, cook!",
"I'm so hungry!",
"This is gonna taste sooo good!",
).random())
}
}
}
@Initializable
class SmellytoesNPC(id: Int = 0, location: Location? = null) : AbstractNPC(id, location) {
override fun construct(id: Int, location: Location?, vararg objects: Any?): AbstractNPC {
return SmellytoesNPC(id, location)
}
override fun getIds(): IntArray {
return intArrayOf(NPCs.SMELLYTOES_6128)
}
override fun handleTickActions() {
super.handleTickActions()
if (RandomFunction.roll(12)) {
sendChat(this, arrayOf(
"Doh ray meeee laa doh faaa!",
"La la la! Do di dum dii!",
).random())
}
}
}
@Initializable
class CreakykneesNPC(id: Int = 0, location: Location? = null) : AbstractNPC(id, location) {
override fun construct(id: Int, location: Location?, vararg objects: Any?): AbstractNPC {
return CreakykneesNPC(id, location)
}
override fun getIds(): IntArray {
return intArrayOf(NPCs.CREAKYKNEES_6129)
}
override fun handleTickActions() {
super.handleTickActions()
if (RandomFunction.roll(12)) {
sendChat(this, arrayOf(
"Was that a spark?",
"Come on! Please light!",
).random())
}
}
}
@Initializable
class LostGoblinNPC(id: Int = 0, location: Location? = null) : AbstractNPC(id, location) {
override fun construct(id: Int, location: Location?, vararg objects: Any?): AbstractNPC {
return LostGoblinNPC(id, location)
}
override fun getIds(): IntArray {
return intArrayOf(NPCs.GOBLIN_6125)
}
override fun handleTickActions() {
super.handleTickActions()
if (RandomFunction.roll(12)) {
sendChat(this, arrayOf(
"Which way should I go?",
"These dungeons are such a maze.",
"Where's the exit?!?",
"This is the fifth time this week. I'm lost!",
"I've been wandering around down here for hours.",
"How do you get back to the village?",
"I hate being so lost!",
"How could I be so disoriented?",
"Where am I? I'm so lost.",
"I know the exit's around here, somewhere."
).random())
}
}
}

View file

@ -0,0 +1,31 @@
package content.region.kandarin.quest.observatoryquest
import content.data.Quests
import core.api.*
import core.game.node.entity.Entity
import core.game.node.entity.npc.AbstractNPC
import core.game.node.entity.player.Player
import core.game.world.map.Location
import core.plugin.Initializable
import org.rs09.consts.NPCs
@Initializable
class GoblinGuardNPC(id: Int = 0, location: Location? = null) : AbstractNPC(id, location) {
override fun construct(id: Int, location: Location, vararg objects: Any): AbstractNPC {
return GoblinGuardNPC(id, location)
}
override fun getIds(): IntArray {
return intArrayOf(NPCs.SLEEPING_GUARD_6122, NPCs.GOBLIN_GUARD_489)
}
override fun finalizeDeath(entity: Entity) {
if (entity is Player) {
val player = entity.asPlayer()
if (getQuestStage(player, Quests.OBSERVATORY_QUEST) >= 4) {
setAttribute(player, ObservatoryQuest.attributeKilledGuard, true)
}
super.finalizeDeath(player)
}
}
}

View file

@ -0,0 +1,238 @@
package content.region.kandarin.quest.observatoryquest
import content.data.Quests
import content.region.kandarin.quest.observatoryquest.ObservatoryQuest.Companion.attributeReceivedWine
import core.api.*
import core.game.dialogue.*
import core.game.node.entity.player.Player
import core.game.node.item.Item
import core.plugin.Initializable
import org.rs09.consts.Items
import org.rs09.consts.NPCs
@Initializable
class ObservatoryAssistantDialogue (player: Player? = null) : DialoguePlugin(player) {
override fun newInstance(player: Player): DialoguePlugin {
return ObservatoryAssistantDialogue(player)
}
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
openDialogue(player, ObservatoryAssistantDialogueFile(), npc)
return false
}
override fun getIds(): IntArray {
return intArrayOf(NPCs.OBSERVATORY_ASSISTANT_6118, 10022)
}
}
class ObservatoryAssistantDialogueFile : DialogueLabeller() {
override fun addConversation() {
assignToIds(NPCs.OBSERVATORY_ASSISTANT_6118)
exec { player, npc ->
if (getQuestStage(player, Quests.OBSERVATORY_QUEST) == 0) {
loadLabel(player, "observatoryQuest0")
} else if (getAttribute(player, attributeReceivedWine, false)) {
loadLabel(player, "receivedwine")
} else if (getQuestStage(player, Quests.OBSERVATORY_QUEST) == 100) {
loadLabel(player, "observatoryqueststage100")
} else {
loadLabel(player, "randomStart" + (1..4).random())
}
}
label("observatoryQuest0")
player(FacialExpression.ASKING, "Hi, are you busy?")
npc("Me? I'm always busy.")
npc("See that man there? That's the professor. If he had his way, I think he'd never let me sleep!")
npc("Anyway, how might I help you?")
options(
DialogueOption("wonderingwhat", "I was wondering what you do here."),
DialogueOption("justlooking", "Just looking around, thanks."),
DialogueOption("looktelescope", "Can I have a look through that telescope?", expression = FacialExpression.ASKING)
)
label("wonderingwhat")
npc("Glad you ask. This is the Observatory reception. Up on the cliff is the Observatory dome, from which you can view the heavens. Usually...")
player(FacialExpression.ASKING, "What do you mean, 'usually'?")
npc("*Ahem*. Back to work, please.")
npc("I'd speak with the professor. He'll explain.")
label("justlooking")
npc("Okay, just don't break anything. If you need any help, let me know.")
line("The assistant continues with his work.")
label("looktelescope")
npc("You can. You won't see much though.")
player(FacialExpression.ASKING, "And that's because?")
npc("Just talk to the professor. He'll fill you in.")
label("randomStart1")
player(FacialExpression.ASKING, "Can I interrupt you?")
npc("I suppose so. Please be quick though.")
goto("afterRandomStart")
label("randomStart2")
player(FacialExpression.ASKING, "Might I have a word?")
npc("Sure, how can I help you?")
goto("afterRandomStart")
label("randomStart3")
player("Hello there.")
npc("Yes?")
goto("afterRandomStart")
label("randomStart4")
player(FacialExpression.ASKING, "Can I speak with you?")
npc("Why, of course. What is it?")
goto("afterRandomStart")
label("afterRandomStart")
exec { player, npc ->
loadLabel(player, "observatoryqueststage" + getQuestStage(player, Quests.OBSERVATORY_QUEST))
}
label("observatoryqueststage1")
exec { player, _ ->
if (inInventory(player, Items.PLANK_960, 3)) {
loadLabel(player, "enoughplanks")
}
else if (inInventory(player, Items.PLANK_960)) {
loadLabel(player, "someplanks")
}
else {
loadLabel(player, "notenoughplanks")
}
}
label("notenoughplanks")
player(FacialExpression.ASKING,"Where can I find planks of wood? I need some for the telescope's base.")
npc("I understand planks can be found at Port Khazard, to the east of here. There are some at the Barbarian Outpost, too.")
npc("Failing that, you could always ask the Sawmill Operator. He's to the north-east of Varrock, by the Lumber Yard.")
label("enoughplanks")
player("I've got some planks for the telescope's base.")
npc("Good work! The professor has been eagerly awaiting them.")
label("someplanks")
player("I've got a plank.")
npc("That's nice.")
player("You know, for the telescope's base.")
npc("Well done. Remember that you'll need three in total.")
label("observatoryqueststage2")
exec { player, _ ->
if(inInventory(player, Items.BRONZE_BAR_2349)) {
loadLabel(player, "hasbronzebar")
} else {
loadLabel(player, "nohasbronzebar")
}
}
label("nohasbronzebar")
player(FacialExpression.ASKING, "Can you help me? How do I go about getting a bronze bar?")
npc("You'll need to use tin and copper ore on a furnace to produce this metal.")
player("Right you are.")
label("hasbronzebar")
player("The bronze bar is ready, and waiting for the professor.")
npc("He'll surely be pleased. Go ahead and give it to him.")
label("observatoryqueststage3")
exec { player, _ ->
if(inInventory(player, Items.MOLTEN_GLASS_1775)) {
loadLabel(player, "hasmoltenglass")
} else {
loadLabel(player, "nohasmoltenglass")
}
}
label("nohasmoltenglass")
player(FacialExpression.ASKING, "What's the best way for me to get molten glass?")
npc("There are many ways, but I'd suggest making it yourself. Get yourself a bucket of sand and some soda ash, which you can get from using seaweed with a furnace. Use the soda ash and sand together in a")
npc("furnace and bang - molten glass is all yours. There's a book about it on the table if you want to know more.")
player("Thank you!")
label("hasmoltenglass")
player("I've managed to get hold of some molten glass.")
npc("I suggest you have a word with the professor, in that case.")
label("observatoryqueststage4")
exec { player, _ ->
if(inInventory(player, Items.LENS_MOULD_602)) {
loadLabel(player, "haslensmould")
} else {
loadLabel(player, "nohaslensmould")
}
}
label("nohaslensmould")
player(FacialExpression.ASKING, "Where can I find this lens mould you mentioned?")
npc("I'm sure I heard one of those goblins talking about it. I bet they've hidden it somewhere. Probably using it for some strange purpose, I'm sure.")
player(FacialExpression.ASKING, "What makes you say that?")
npc("I had a nice new star chart, until recently. I went out to do an errand for the professor the other day, only to see a goblin using it...")
npc("...as some kind of makeshift hankey to blow his nose!")
player("Oh dear.")
npc("You may want to look through the dungeon they have under their little village.")
player("Thanks for the advice.")
label("haslensmould")
player("I have the lens mould.")
npc("Well done on finding that! I am honestly quite impressed. Make sure you take it straight to the professor.")
player("Will do.")
label("observatoryqueststage5")
exec { player, _ ->
if(inInventory(player, Items.OBSERVATORY_LENS_603)) {
loadLabel(player, "haslens")
} else {
loadLabel(player, "nohaslens")
}
}
label("nohaslens")
player(FacialExpression.ASKING, "How should I make this lens?")
npc("Just use the molten glass with the mould. Simple.")
player("Thanks!")
label("haslens")
player("Do you like this lens? Good, huh?")
npc("Nice. What's that scratch?")
player("Oh, erm, that's a feature.")
player("Yes, that's it! Indubitably, it facilitates the triangulation of photonic illumination to the correct...")
npc("Stop! You can't confuse me with big words. Just pray the professor doesn't notice.")
label("observatoryqueststage6")
player("Hello again.")
npc("Ah, it's the telescope repairman! The professor is waiting for you in the Observatory.")
player("How can I get to the Observatory?")
npc("Well, since the bridge was ruined, you will have to travel through the dungeon under the goblins' settlement.")
label("observatoryqueststage100")
player("Hi assistant.")
player("Wait a minute.")
player(FacialExpression.ASKING, "What's your real name?")
npc(FacialExpression.ASKING, "My real name?")
player(FacialExpression.ASKING, "I only know you as the professor's assistant. What's your actual name?")
npc("Patrick.")
player("Hi Patrick, I'm @name.")
npc("Well, hello again, and thanks for helping out the professor.")
npc(" Oh, and, believe it or not, his name is Mambo-duna-roona, but don't tell him I told you.")
player(FacialExpression.AMAZED, "You made that up!")
npc("No, honest! Anyways, you've made my life much easier. Have a drink on me!")
item(Item(Items.JUG_OF_WINE_1993), "The assistant gives you some wine.")
exec { player, _ ->
addItemOrDrop(player, Items.JUG_OF_WINE_1993)
setAttribute(player, attributeReceivedWine, true)
}
player("Thanks very much.")
npc("No problem. Scorpius would be proud.")
player(FacialExpression.ASKING, "Sorry?")
npc("You may want to check out that book on the table, and perhaps look around for a grave...")
label("receivedwine")
npc(FacialExpression.ASKING, "How was the wine?")
player(FacialExpression.DRUNK, "That was good stuff, *hic*! Wheresh the professher?")
npc(FacialExpression.ASKING, "The professor? He's up in the Observatory. Since the bridge was ruined, you will have to travel through the dungeon under the goblins' settlement.")
}
}

View file

@ -0,0 +1,199 @@
package content.region.kandarin.quest.observatoryquest
import core.api.*
import core.game.activity.Cutscene
import core.game.dialogue.FacialExpression
import core.game.node.entity.player.Player
import core.game.world.map.Direction
import org.rs09.consts.Animations
import org.rs09.consts.NPCs
import content.region.kandarin.quest.observatoryquest.ObservatoryQuest.Companion.attributeFinishedCutscene
import core.game.world.map.Location
class ObservatoryCutscene(player: Player) : Cutscene(player) {
override fun setup() {
setExit(Location(2438, 3163))
loadRegion(9777)
addNPC(PROFESSOR, 7, 25, Direction.SOUTH)
}
override fun runStage(stage: Int) {
when (stage) {
0 -> {
fadeToBlack()
timedUpdate(5)
}
1 -> {
teleport(player, 6, 27)
face(player, getNPC(PROFESSOR)!!.location)
rotateCamera(9, 25, 300)
moveCamera(25, 22, 1800)
timedUpdate(5)
}
2 -> {
fadeFromBlack()
dialogueLinesUpdate("<col=8A0808>~ The Observatory ~</col>", "The great eye into the heavens.")
}
3 -> {
moveCamera(14, 10, 1800, 10)
timedUpdate(3)
}
4 -> {
moveCamera(6, 10, 1800, 10)
timedUpdate(3)
}
5 -> {
moveCamera(0, 32, 1800, 10)
timedUpdate(3)
}
6 -> {
moveCamera(4, 36, 1600, 10)
timedUpdate(3)
}
7 -> {
rotateCamera(7, 25, 300, 5)
moveCamera(13, 40, 1800, 10)
timedUpdate(3)
}
8 -> {
moveCamera(12, 36, 1800, 5)
timedUpdate(5)
}
9 -> {
fadeToBlack()
timedUpdate(5)
}
10 -> {
moveCamera(5, 21, 500)
rotateCamera(6, 27, 100)
timedUpdate(3)
}
11 -> {
fadeFromBlack()
timedUpdate(5)
}
12 -> {
playerDialogueUpdate(FacialExpression.NEUTRAL, "Hi professor!")
}
13 -> {
face(getNPC(PROFESSOR)!!, player.location)
timedUpdate(3)
}
14 -> {
animate(getNPC(PROFESSOR)!!, WAVE)
dialogueUpdate(PROFESSOR, FacialExpression.HAPPY, "Oh, hi there.")
}
15 -> {
dialogueUpdate(PROFESSOR, FacialExpression.HAPPY, "I'm just adding the finishing touches.")
}
16 -> {
playerDialogueUpdate(FacialExpression.HAPPY, "Okay, don't let me interrupt.")
}
17 -> {
dialogueUpdate(PROFESSOR, FacialExpression.NEUTRAL, "Thank you.")
}
18 -> {
face(getNPC(PROFESSOR)!!, Location(136, 25))
dialogueUpdate(PROFESSOR, FacialExpression.NEUTRAL, "Right, let's get this finished.")
}
19 -> {
animate(getNPC(PROFESSOR)!!, THINKING)
sendChat(getNPC(PROFESSOR)!!, "Hmmmm...")
timedUpdate(5)
}
20 -> {
move(getNPC(PROFESSOR)!!, 7, 23)
rotateCamera(9, 23, 100)
moveCamera(12, 30, 300)
timedUpdate(3)
}
21 -> {
move(getNPC(PROFESSOR)!!, 10, 26)
timedUpdate(10)
}
22 -> {
face(getNPC(PROFESSOR)!!, Location(135, 25))
animate(getNPC(PROFESSOR)!!, FIX)
sendChat(getNPC(PROFESSOR)!!, "Bit of a tap here...")
timedUpdate(3)
}
23 -> {
move(getNPC(PROFESSOR)!!, 11, 26)
timedUpdate(5)
}
24 -> {
face(getNPC(PROFESSOR)!!, player.location)
dialogueUpdate(PROFESSOR, FacialExpression.HAPPY, "@name, I'm just going upstairs to finish off.")
}
25 -> {
playerDialogueUpdate(FacialExpression.HAPPY, "Right-oh.")
}
26 -> {
face(getNPC(PROFESSOR)!!, Location(140, 25))
timedUpdate(3)
}
27 -> {
teleport(getNPC(PROFESSOR)!!, 11, 22, 1)
teleport(player, 14,29,1)
face(getNPC(PROFESSOR)!!, Location(2442, 3158, 1))
moveCamera(6, 20, 400)
rotateCamera(10, 24, 400)
timedUpdate(5)
}
28 -> {
move(getNPC(PROFESSOR)!!, 7, 27)
moveCamera(10, 20, 400, 1)
rotateCamera(7, 27, 50, 20)
timedUpdate(10)
}
29 -> {
sendChat(getNPC(PROFESSOR)!!, "In goes the lens.")
timedUpdate(3)
}
30 -> {
animate(getNPC(PROFESSOR)!!, TUNEUP)
timedUpdate(20)
}
31 -> {
sendChat(getNPC(PROFESSOR)!!, "And one final adjustment.")
move(getNPC(PROFESSOR)!!, 10, 29)
timedUpdate(6)
}
32 -> {
move(getNPC(PROFESSOR)!!, 10, 25)
face(getNPC(PROFESSOR)!!, Location(137, 26))
timedUpdate(6)
}
33 -> {
face(getNPC(PROFESSOR)!!, Location(137, 26))
animate(getNPC(PROFESSOR)!!, CRANK)
sendChat(getNPC(PROFESSOR)!!, "And all our work pays off.")
timedUpdate(6)
}
34 -> {
animate(getNPC(PROFESSOR)!!, CHEER)
timedUpdate(10)
}
35 -> {
moveCamera(6, 27, 500, 5)
rotateCamera(10, 25, 50, 5)
timedUpdate(3)
}
36 -> {
end {
setAttribute(player, attributeFinishedCutscene, true)
}
}
}
}
companion object {
val PROFESSOR = NPCs.OBSERVATORY_PROFESSOR_6121
val WAVE = Animations.HUMAN_WAVE_863
val THINKING = 6844
val FIX = 6847
val TUNEUP = 6848
val CRANK = 6845
val CHEER = Animations.HUMAN_CHEER_862
}
}

View file

@ -0,0 +1,676 @@
package content.region.kandarin.quest.observatoryquest
import content.data.Quests
import core.api.*
import core.game.dialogue.*
import content.region.kandarin.quest.observatoryquest.ObservatoryQuest.Companion.attributeReceivedWine
import core.game.interaction.QueueStrength
import core.game.node.entity.player.Player
import core.game.node.entity.skill.Skills
import core.game.node.item.Item
import core.plugin.Initializable
import org.rs09.consts.Components
import org.rs09.consts.Items
import org.rs09.consts.NPCs
@Initializable
class ObservatoryProfessorDialogue (player: Player? = null) : DialoguePlugin(player) {
override fun newInstance(player: Player): DialoguePlugin {
return ObservatoryProfessorDialogue(player)
}
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
openDialogue(player, ObservatoryProfessorDialogueFile(), npc)
return false
}
override fun getIds(): IntArray {
return intArrayOf(NPCs.OBSERVATORY_ASSISTANT_6119, NPCs.OBSERVATORY_ASSISTANT_6120)
}
}
class ObservatoryProfessorDialogueFile : DialogueLabeller() {
override fun addConversation() {
assignToIds(NPCs.OBSERVATORY_PROFESSOR_488)
npc("What would you like to talk about?")
options(
DialogueOption("observatoryquest", "Talk about the Observatory Quest.", skipPlayer = true),
DialogueOption("treasuretrails", "Talk about the Treasure Trails.", skipPlayer = true),
)
label("observatoryquest")
exec { player, npc ->
loadLabel(player, "observatoryqueststage" + getQuestStage(player, Quests.OBSERVATORY_QUEST))
}
label("observatoryqueststage0")
player("Hi, I was...")
npc(FacialExpression.FRIENDLY, "Welcome to the magnificent wonder of the Observatory, where wonder is all around you, where the stars can be clutched from the heavens!")
player("Wow, nice intro.")
npc(FacialExpression.FRIENDLY, "Why, thanks! How might I help you?")
options(
DialogueOption("totallylost", "I'm totally lost."),
DialogueOption("whatwhat", "An Observatory?", expression = FacialExpression.THINKING),
DialogueOption("nah", "I'm just passing through."),
)
label("totallylost")
npc(FacialExpression.THINKING, "Lost? It must have been those pesky goblins that led you astray.")
npc("Head north-east to find the city of Ardougne.")
player("I'm sure I'll find the way.")
player("Thanks for all your help.")
npc(FacialExpression.FRIENDLY, "No problem at all. Come and visit again!")
line("The professor carries on with his studies.")
label("nah")
npc("Fair enough. Not everyone is interested in this place, I suppose.")
label("whatwhat")
npc(FacialExpression.FRIENDLY, "Of course. We have a superb telescope up in the Observatory, on the hill.")
npc(FacialExpression.FRIENDLY, "A truly marvellous invention, the likes of which you'll never behold again.")
npc(FacialExpression.NEUTRAL, NPCs.OBSERVATORY_ASSISTANT_6118, "Well, it would be if it worked.")
npc(FacialExpression.ANGRY, "Don't interrupt!")
player(FacialExpression.THINKING, "What? It doesn't work?")
npc("Oh, no, no, no. Don't listen to him, he's joking. Aren't you, my FAITHFUL assistant?")
npc(FacialExpression.NEUTRAL, NPCs.OBSERVATORY_ASSISTANT_6118, "Nope, dead serious. Hasn't been working for a long time.")
npc(FacialExpression.ANGRY, "Arghhh! Get back to work and stop sticking your nose in!")
player("So, it's broken. How come?")
npc(FacialExpression.SAD, "Oh, I suppose there's no use keeping it secret. Did you see those houses outside?")
player("Up on the hill? Yes, I've seen them.")
npc("It's a horde of goblins.")
npc(FacialExpression.SAD, "Since they moved here they have caused nothing but trouble.")
npc("Last week, my telescope was tampered with.")
npc(FacialExpression.ANGRY, "Now, parts need replacing before it can be used again. They've even been messing around in the dungeons under this area. Something needs to be done.")
npc(FacialExpression.NEUTRAL, NPCs.OBSERVATORY_ASSISTANT_6118, "Strikes me that this visitor could help us.")
npc(FacialExpression.ANGRY, "Stop being so rude.")
npc("...")
npc("Although, he has a point. What do you say?")
player(FacialExpression.THINKING, "What, me?")
options(
DialogueOption("yestoquest", "Sounds interesting. How can I help?", "Sounds interesting, what can I do for you?", FacialExpression.FRIENDLY),
DialogueOption("notoquest", "Oh, sorry, I don't have time for that."),
)
label("notoquest")
npc("Oh dear. I really do need some help.")
npc("If you see anyone who can help then please send them my way.")
label("yestoquest")
exec { player, _ ->
if(getQuestStage(player, Quests.OBSERVATORY_QUEST) == 0) {
setQuestStage(player, Quests.OBSERVATORY_QUEST, 1)
}
}
npc(FacialExpression.FRIENDLY, "Oh, thanks so much.")
npc(FacialExpression.FRIENDLY, "I shall need some materials for the telescope, so it can be used again.")
npc("Let's start with three planks of wood for the telescope base. My assistant will help with obtaining these, won't you?")
npc(FacialExpression.NEUTRAL, NPCs.OBSERVATORY_ASSISTANT_6118, "As if I don't have enough work to do. Seems I don't have a choice.")
npc(FacialExpression.FRIENDLY, "Go talk to him if you need some advice.")
player(FacialExpression.FRIENDLY, "Okay, I'll be right back.")
label("observatoryqueststage1")
player(FacialExpression.FRIENDLY, "Hi again!")
npc(FacialExpression.FRIENDLY, "It's my helping hand, back again.")
npc(FacialExpression.THINKING, "Do you have the planks yet?")
exec { player, _ ->
if(inInventory(player, Items.PLANK_960, 3)) {
loadLabel(player, "enoughplanks")
} else {
loadLabel(player, "notenoughplanks")
}
}
label("notenoughplanks")
player("Sorry, not yet. Three planks was it?")
npc("It was indeed.")
label("enoughplanks")
player("Yes, I've got them. Here they are.")
exec { player, _ ->
if(removeItem(player, Item(Items.PLANK_960, 3))) {
if (getQuestStage(player, Quests.OBSERVATORY_QUEST) == 1) {
setQuestStage(player, Quests.OBSERVATORY_QUEST, 2)
}
}
}
npc(FacialExpression.FRIENDLY, "Well done. This will make a big difference.")
npc(FacialExpression.FRIENDLY, "Now, the bronze for the tube. Oh, assistant!")
npc(FacialExpression.NEUTRAL, NPCs.OBSERVATORY_ASSISTANT_6118, "Okay, okay, ask me if you need any help, @name.")
label("observatoryqueststage2")
player("Hi.")
npc("The traveller returns!")
player("Still working hard?")
npc(FacialExpression.NEUTRAL, NPCs.OBSERVATORY_ASSISTANT_6118, "Some of us are.")
npc(FacialExpression.ANGRY, "What did I tell you about speaking when spoken to?")
npc(FacialExpression.THINKING, "So, @name, you have the bronze bar?")
exec { player, _ ->
if(inInventory(player, Items.BRONZE_BAR_2349)) {
loadLabel(player, "hasbronzebar")
} else {
loadLabel(player, "nohasbronzebar")
}
}
label("nohasbronzebar")
player("Not yet.")
npc("Please bring me one, then.")
label("hasbronzebar")
player(FacialExpression.FRIENDLY, "I certainly do. Here you go.")
exec { player, _ ->
if(removeItem(player, Item(Items.BRONZE_BAR_2349))) {
if (getQuestStage(player, Quests.OBSERVATORY_QUEST) == 2) {
setQuestStage(player, Quests.OBSERVATORY_QUEST, 3)
}
}
}
npc(FacialExpression.FRIENDLY, "Great. Now all I need is the lens made.")
npc(FacialExpression.FRIENDLY, "Please get me some molten glass.")
npc("Oi! Lazy bones!")
player(FacialExpression.AMAZED, "What? I'm not lazy.")
npc("Not you! I'm talking to my assistant.")
npc(FacialExpression.NEUTRAL, NPCs.OBSERVATORY_ASSISTANT_6118, "Calm down old man, I heard. @name, I'm here if you need any help.")
npc("Thank you. Wait a minute, who are you calling 'old'?")
label("observatoryqueststage3")
npc("How are you getting on finding me some molten glass?")
exec { player, _ ->
if(inInventory(player, Items.MOLTEN_GLASS_1775)) {
loadLabel(player, "hasmoltenglass")
} else {
loadLabel(player, "nohasmoltenglass")
}
}
label("nohasmoltenglass")
player("Still working on it.")
npc("I really need it. Please hurry.")
label("hasmoltenglass")
player(FacialExpression.FRIENDLY, "Here it is.")
exec { player, _ ->
if(removeItem(player, Item(Items.MOLTEN_GLASS_1775))) {
if (getQuestStage(player, Quests.OBSERVATORY_QUEST) == 3) {
setQuestStage(player, Quests.OBSERVATORY_QUEST, 4)
}
}
}
npc(FacialExpression.FRIENDLY, "Excellent work, let's make the lens.")
npc(FacialExpression.NEUTRAL, NPCs.OBSERVATORY_ASSISTANT_6118, "It'll need to be made to an exact shape and size.")
npc("Well, obviously, hence why we have a lens mould.")
npc(FacialExpression.NEUTRAL, NPCs.OBSERVATORY_ASSISTANT_6118, "Not any more. One of those goblins took it.")
npc(FacialExpression.SAD, "Great, just what I need. @name, I don't suppose you could find it?")
player(FacialExpression.FRIENDLY, "I'll have a look - where should I start?")
npc(FacialExpression.FRIENDLY, "No idea. You could ask my USELESS assistant if you want.")
npc(FacialExpression.NEUTRAL, NPCs.OBSERVATORY_ASSISTANT_6118, "What have I done to deserve this?")
label("observatoryqueststage4")
npc(FacialExpression.THINKING, "Did you bring me the mould?")
exec { player, _ ->
if(inInventory(player, Items.LENS_MOULD_602)) {
loadLabel(player, "haslensmould")
} else {
loadLabel(player, "nohaslensmould")
}
}
label("nohaslensmould")
player("Still looking for it.")
npc("Please try and find it; my assistant may be able to help.")
label("haslensmould")
player(FacialExpression.HAPPY, "I certainly have. You'll never guess what they were doing with it.")
npc("Well, from the smell I'd guess cooking some vile concoction.")
player(FacialExpression.HAPPY, "Wow, good guess. Well, here you go.")
npc(FacialExpression.NEUTRAL, NPCs.OBSERVATORY_ASSISTANT_6118, "Please don't give that to him. Last time he tried any Crafting, I had to spend a week cleaning up after the explosion.")
player("Explosion?")
npc(FacialExpression.SUSPICIOUS, "Erm, yes. I think in this instance you had probably better do it.")
player("I suppose it's better I don't ask.")
npc(FacialExpression.HAPPY,"You can use the mould with molten glass to make a new lens.")
exec { player, _ ->
if(inInventory(player, Items.LENS_MOULD_602)) {
addItemOrDrop(player, Items.MOLTEN_GLASS_1775)
if (getQuestStage(player, Quests.OBSERVATORY_QUEST) == 4) {
setQuestStage(player, Quests.OBSERVATORY_QUEST, 5)
}
}
}
item(Item(Items.MOLTEN_GLASS_1775), "The professor gives you back the molten glass.")
label("observatoryqueststage5")
npc("Is the lens finished?")
exec { player, _ ->
if(inInventory(player, Items.OBSERVATORY_LENS_603)) {
loadLabel(player, "haslens")
} else {
loadLabel(player, "nohaslens")
}
}
label("nohaslens")
player("How do I make it again?")
npc("Use the molten glass with the mould.")
player("Huh. Simple.")
label("haslens")
player("Yes, here it is. You may as well take this mould too.") //No source if no mould present
line("The player hands the observatory professor the observatory lens.")
npc("Wonderful, at last I can fix the telescope.")
npc("Would you accompany me to the Observatory? You simply must see the telescope in operation.")
player("Sounds interesting. Count me in.")
npc("Superb. You'll have to go via the dungeon under the goblin settlement, seeing as the bridge is broken. You'll find stairs up to the Observatory from there.")
player("Okay. See you there.")
exec { player, _ ->
setVarbit(player, ObservatoryQuest.telescopeVarbit, 1, true)
queueScript(player, 0, QueueStrength.SOFT) { stage: Int ->
when (stage) {
0 -> {
openOverlay(player, Components.FADE_TO_BLACK_120)
return@queueScript delayScript(player, 4)
}
1 -> {
if(removeItem(player, Item(Items.OBSERVATORY_LENS_603))) {
removeItem(player, Item(Items.LENS_MOULD_602))
if (getQuestStage(player, Quests.OBSERVATORY_QUEST) == 5) {
setQuestStage(player, Quests.OBSERVATORY_QUEST, 6)
}
}
return@queueScript delayScript(player, 1)
}
2 -> {
openOverlay(player, Components.FADE_FROM_BLACK_170)
return@queueScript delayScript(player, 2)
}
3 -> {
sendDialogueLines(player, "The professor has gone ahead to the Observatory dome. Best you", "follow him to see the finished telescope.")
return@queueScript stopExecuting(player)
}
else -> return@queueScript stopExecuting(player)
}
}
}
label("observatoryqueststage6")
npc("Hello, friend.")
exec { player, _ ->
if (getAttribute<Int?>(player, ObservatoryQuest.attributeTelescopeStar, null) != null) {
loadLabel(player, "hasviewtelescope")
} else {
loadLabel(player, "nohasviewtelescope")
}
}
label("nohasviewtelescope")
// http://youtu.be/cK5suqcw3qU
player("Hi, this really is impressive.")
npc("Certainly is. Please, take a look through the telescope and tell me what you see.")
label("hasviewtelescope")
player("I've had a look through the telescope.")
npc("What did you see? If you're not sure, you can find out by looking at the star charts dotted around the walls downstairs.")
player("It was...")
goto("page1")
label("page1")
options(
DialogueOption("Aquarius", "Aquarius", skipPlayer = true),
DialogueOption("Capricorn", "Capricorn", skipPlayer = true),
DialogueOption("Sagittarius", "Sagittarius", skipPlayer = true),
DialogueOption("Scorpio", "Scorpio", skipPlayer = true),
DialogueOption("page2", "~ next ~", skipPlayer = true),
)
label("page2")
options(
DialogueOption("page1", "~ previous ~", skipPlayer = true),
DialogueOption("Libra", "Libra", skipPlayer = true),
DialogueOption("Virgo", "Virgo", skipPlayer = true),
DialogueOption("Leo", "Leo", skipPlayer = true),
DialogueOption("page3", "~ next ~", skipPlayer = true),
)
label("page3")
options(
DialogueOption("page2", "~ previous ~", skipPlayer = true),
DialogueOption("Cancer", "Cancer", skipPlayer = true),
DialogueOption("Gemini", "Gemini", skipPlayer = true),
DialogueOption("Taurus", "Taurus", skipPlayer = true),
DialogueOption("page4", "~ next ~", skipPlayer = true),
)
label("page4")
options(
DialogueOption("page3", "~ previous ~", skipPlayer = true),
DialogueOption("Aries", "Aries", skipPlayer = true),
DialogueOption("Pisces", "Pisces", skipPlayer = true),
)
label("Aquarius")
player("Aquarius!")
exec { player, _ ->
if (getAttribute<Int?>(player, ObservatoryQuest.attributeTelescopeStar, null) == 19) {
loadLabel(player, "Aquariuscorrect")
} else {
loadLabel(player, "wrongstar")
}
}
label("Aquariuscorrect")
npc("That's exactly it!")
player("Yes! Woo hoo!")
npc("That's Aquarius, the water-bearer.")
npc("It seems suitable, then, to award you with water runes!")
// Usually it is given here, but I don't want loopholes.
npc("By Saradomin's earlobes! You must be a friend of the gods indeed.")
npc("Look in your backpack for your reward, in payment for your work.")
exec { player, _ ->
addItemOrDrop(player, Items.WATER_RUNE_555, 25)
addItemOrDrop(player, Items.UNCUT_SAPPHIRE_1623)
finishQuest(player, Quests.OBSERVATORY_QUEST)
}
label("Aries")
player("Aries!")
exec { player, _ ->
if (getAttribute<Int?>(player, ObservatoryQuest.attributeTelescopeStar, null) == 20) {
loadLabel(player, "Ariescorrect")
} else {
loadLabel(player, "wrongstar")
}
}
label("Ariescorrect")
npc("That's exactly it!")
player("Yes! Woo hoo!")
npc("That's Aries, the ram.")
npc("A fierce fighter. I'm sure he'll look down on you and improve your Attack for such insight.")
// Usually it is given here, but I don't want loopholes.
npc("By Saradomin's earlobes! You must be a friend of the gods indeed.")
npc("Look in your backpack for your reward, in payment for your work.")
exec { player, _ ->
rewardXP(player, Skills.ATTACK, 875.0)
addItemOrDrop(player, Items.UNCUT_SAPPHIRE_1623)
finishQuest(player, Quests.OBSERVATORY_QUEST)
}
label("Cancer")
player("Cancer!")
exec { player, _ ->
if (getAttribute<Int?>(player, ObservatoryQuest.attributeTelescopeStar, null) == 21) {
loadLabel(player, "Cancercorrect")
} else {
loadLabel(player, "wrongstar")
}
}
label("Cancercorrect")
npc("That's exactly it!")
player("Yes! Woo hoo!")
npc("That's Cancer, the crab.")
npc("An armoured creature - I think I shall reward you with an amulet of protection.")
// Usually it is given here, but I don't want loopholes.
npc("By Saradomin's earlobes! You must be a friend of the gods indeed.")
npc("Look in your backpack for your reward, in payment for your work.")
exec { player, _ ->
addItemOrDrop(player, Items.AMULET_OF_DEFENCE_1729)
addItemOrDrop(player, Items.UNCUT_SAPPHIRE_1623)
finishQuest(player, Quests.OBSERVATORY_QUEST)
}
label("Capricorn")
player("Capricorn!")
exec { player, _ ->
if (getAttribute<Int?>(player, ObservatoryQuest.attributeTelescopeStar, null) == 22) {
loadLabel(player, "Capricorncorrect")
} else {
loadLabel(player, "wrongstar")
}
}
label("Capricorncorrect")
npc("That's exactly it!")
player("Yes! Woo hoo!")
npc("That's Capricorn, the goat.")
npc("Capricorn will surely reward your insight with an increase to your Strength.")
// Usually it is given here, but I don't want loopholes.
npc("By Saradomin's earlobes! You must be a friend of the gods indeed.")
npc("Look in your backpack for your reward, in payment for your work.")
exec { player, _ ->
rewardXP(player, Skills.STRENGTH, 875.0)
addItemOrDrop(player, Items.UNCUT_SAPPHIRE_1623)
finishQuest(player, Quests.OBSERVATORY_QUEST)
}
label("Gemini")
player("Gemini!")
exec { player, _ ->
if (getAttribute<Int?>(player, ObservatoryQuest.attributeTelescopeStar, null) == 23) {
loadLabel(player, "Geminicorrect")
} else {
loadLabel(player, "wrongstar")
}
}
label("Geminicorrect")
npc("That's exactly it!")
player("Yes! Woo hoo!")
npc("That's Gemini, the twins.")
npc("With the double nature of Gemini, I can't offer you anything more suitable than a two-handed weapon.")
// Usually it is given here, but I don't want loopholes.
npc("By Saradomin's earlobes! You must be a friend of the gods indeed.")
npc("Look in your backpack for your reward, in payment for your work.")
exec { player, _ ->
addItemOrDrop(player, Items.BLACK_2H_SWORD_1313)
addItemOrDrop(player, Items.UNCUT_SAPPHIRE_1623)
finishQuest(player, Quests.OBSERVATORY_QUEST)
}
label("Leo")
player("Leo!")
exec { player, _ ->
if (getAttribute<Int?>(player, ObservatoryQuest.attributeTelescopeStar, null) == 24) {
loadLabel(player, "Leocorrect")
} else {
loadLabel(player, "wrongstar")
}
}
label("Leocorrect")
npc("That's exactly it!")
player("Yes! Woo hoo!")
npc("That's Leo, the lion.")
npc("I think the majestic power of the lion will raise your Hitpoints.")
// Usually it is given here, but I don't want loopholes.
npc("By Saradomin's earlobes! You must be a friend of the gods indeed.")
npc("Look in your backpack for your reward, in payment for your work.")
exec { player, _ ->
rewardXP(player, Skills.HITPOINTS, 875.0)
addItemOrDrop(player, Items.UNCUT_SAPPHIRE_1623)
finishQuest(player, Quests.OBSERVATORY_QUEST)
}
label("Libra")
player("Libra!")
exec { player, _ ->
if (getAttribute<Int?>(player, ObservatoryQuest.attributeTelescopeStar, null) == 25) {
loadLabel(player, "Libracorrect")
} else {
loadLabel(player, "wrongstar")
}
}
label("Libracorrect")
npc("That's exactly it!")
player("Yes! Woo hoo!")
npc("That's Libra, the scales.")
npc("Hmmm, balance, law, order - I shall award you with law runes!")
// Usually it is given here, but I don't want loopholes.
npc("By Saradomin's earlobes! You must be a friend of the gods indeed.")
npc("Look in your backpack for your reward, in payment for your work.")
exec { player, _ ->
addItemOrDrop(player, Items.LAW_RUNE_563, 25)
addItemOrDrop(player, Items.UNCUT_SAPPHIRE_1623)
finishQuest(player, Quests.OBSERVATORY_QUEST)
}
label("Pisces")
player("Pisces!")
exec { player, _ ->
if (getAttribute<Int?>(player, ObservatoryQuest.attributeTelescopeStar, null) == 26) {
loadLabel(player, "Piscescorrect")
} else {
loadLabel(player, "wrongstar")
}
}
label("Piscescorrect")
npc("That's exactly it!")
player("Yes! Woo hoo!")
npc("That's Pisces, the fish.")
npc("What's more suitable as a reward than some tuna?")
// Usually it is given here, but I don't want loopholes.
npc("By Saradomin's earlobes! You must be a friend of the gods indeed.")
npc("Look in your backpack for your reward, in payment for your work.")
exec { player, _ ->
addItemOrDrop(player, Items.TUNA_361, 3)
addItemOrDrop(player, Items.UNCUT_SAPPHIRE_1623)
finishQuest(player, Quests.OBSERVATORY_QUEST)
}
label("Sagittarius")
player("Sagittarius!")
exec { player, _ ->
if (getAttribute<Int?>(player, ObservatoryQuest.attributeTelescopeStar, null) == 27) {
loadLabel(player, "Sagittariuscorrect")
} else {
loadLabel(player, "wrongstar")
}
}
label("Sagittariuscorrect")
npc("That's exactly it!")
player("Yes! Woo hoo!")
npc("That's Sagittarius, the centaur.")
npc("As you've spotted the archer, I shall reward you with a maple longbow.")
// Usually it is given here, but I don't want loopholes.
npc("By Saradomin's earlobes! You must be a friend of the gods indeed.")
npc("Look in your backpack for your reward, in payment for your work.")
exec { player, _ ->
addItemOrDrop(player, Items.MAPLE_LONGBOW_851)
addItemOrDrop(player, Items.UNCUT_SAPPHIRE_1623)
finishQuest(player, Quests.OBSERVATORY_QUEST)
}
label("Scorpio")
player("Scorpio!")
exec { player, _ ->
if (getAttribute<Int?>(player, ObservatoryQuest.attributeTelescopeStar, null) == 28) {
loadLabel(player, "Scorpiocorrect")
} else {
loadLabel(player, "wrongstar")
}
}
label("Scorpiocorrect")
npc("That's exactly it!")
player("Yes! Woo hoo!")
npc("That's Scorpio, the scorpion.")
npc("I think weapon poison would make a suitable reward.")
// Usually it is given here, but I don't want loopholes.
npc("By Saradomin's earlobes! You must be a friend of the gods indeed.")
npc("Look in your backpack for your reward, in payment for your work.")
exec { player, _ ->
addItemOrDrop(player, Items.WEAPON_POISON_187)
addItemOrDrop(player, Items.UNCUT_SAPPHIRE_1623)
finishQuest(player, Quests.OBSERVATORY_QUEST)
}
label("Taurus")
player("Taurus!")
exec { player, _ ->
if (getAttribute<Int?>(player, ObservatoryQuest.attributeTelescopeStar, null) == 29) {
loadLabel(player, "Tauruscorrect")
} else {
loadLabel(player, "wrongstar")
}
}
label("Tauruscorrect")
npc("That's exactly it!")
player("Yes! Woo hoo!")
npc("That's Taurus, the bull.")
npc("This Strength potion should be a suitable reward.")
// Usually it is given here, but I don't want loopholes.
npc("By Saradomin's earlobes! You must be a friend of the gods indeed.")
npc("Look in your backpack for your reward, in payment for your work.")
exec { player, _ ->
addItemOrDrop(player, Items.SUPER_STRENGTH1_161)
addItemOrDrop(player, Items.UNCUT_SAPPHIRE_1623)
finishQuest(player, Quests.OBSERVATORY_QUEST)
}
label("Virgo")
player("Virgo!")
exec { player, _ ->
if (getAttribute<Int?>(player, ObservatoryQuest.attributeTelescopeStar, null) == 30) {
loadLabel(player, "Virgocorrect")
} else {
loadLabel(player, "wrongstar")
}
}
label("Virgocorrect")
npc("That's exactly it!")
player("Yes! Woo hoo!")
npc("That's Virgo, the virtuous.")
npc("Virgo will surely provide you with an increase to Defence.")
// Usually it is given here, but I don't want loopholes.
npc("By Saradomin's earlobes! You must be a friend of the gods indeed.")
npc("Look in your backpack for your reward, in payment for your work.")
exec { player, _ ->
rewardXP(player, Skills.DEFENCE, 875.0)
addItemOrDrop(player, Items.UNCUT_SAPPHIRE_1623)
finishQuest(player, Quests.OBSERVATORY_QUEST)
}
label("wrongstar")
npc("I'm afraid not. Have another look. Remember, you can check the star charts on the walls for reference.")
// http://youtu.be/Z5RRnZl2vTg
label("observatoryqueststage100")
npc("Thanks for all your help with the telescope. What can I do for you?")
options(
DialogueOption("needmorehelp", "Do you need any more help with the telescope?", expression = FacialExpression.ASKING),
DialogueOption("mambodunaroona", "Is it true your name is Mambo-duna-roona?", expression = FacialExpression.ASKING) { player, _ ->
return@DialogueOption getAttribute(player, attributeReceivedWine, false)
},
DialogueOption("nevermind", "Nothing, thanks."),
)
label("needmorehelp")
npc("Not right now,")
npc("but the stars may hold a secret for you.")
label("nevermind")
npc("Okay, no problem. See you again.")
label("treasuretrails")
npc("Welcome back! How can I help you today?")
player("Can you teach me to solve treasure trail clues?")
npc("Ah, I get asked about treasure trails all the time! Listen carefully and I shall tell you what I know...")
npc("Lots of clues have <col=8A0808>degrees</col> and <col=8A0808>minutes</col> written on them. These are the coordinates of the place where the treasure is buried.")
npc("You have to walk to the correct spot, so that your coordinates are exactly the same as the values written on the clue scroll.")
npc("To do this, you must use a <col=8A0808>sextant</col>, a <col=8A0808>watch</col> and a <col=8A0808>chart</col> to find your own coordinates.")
npc("Once you know the coordinates of the place where you are, you know which way you have to walk to get to the place where the treasure is!")
player("Riiight. So where do I get those items from?")
npc("I think Murphy, the owner of the fishing trawler moored south of Ardougne, might be able to spare you a sextant. Then the nearest Clock Tower is south of Ardougne - you could probably get a watch there. I've")
npc("got plenty of charts myself, here have one.")
label("mambodunaroona")
npc(FacialExpression.AMAZED, "How do you know tha-")
npc(FacialExpression.SUSPICIOUS, "I mean, of course not, what a silly idea.")
}
}

View file

@ -0,0 +1,159 @@
package content.region.kandarin.quest.observatoryquest
import content.data.Quests
import core.api.*
import core.api.setVarp
import core.game.node.entity.player.Player
import core.game.node.entity.player.link.quest.Quest
import core.game.node.entity.skill.Skills
import core.plugin.Initializable
import org.rs09.consts.Items
// http://youtu.be/TWIkCRRea8A The initial quest log.
// http://youtu.be/onHNm9Z5L-o The best full quest log.
// http://youtu.be/cq-jGTXXHuE
// http://youtu.be/ekYr30h43ag Scorpius.
/**
* Observatory Quest
*/
@Initializable
class ObservatoryQuest : Quest(Quests.OBSERVATORY_QUEST, 96, 95, 2,112, 0, 1, 7) {
companion object {
val questName = Quests.OBSERVATORY_QUEST
const val observatoryVarp = 112
const val goblinStoveVarbit = 3837
const val telescopeVarbit = 3838
const val starChartsInterface = 104
const val telescopeInterface = 552
const val dungeonWarning = 560
const val attributeKilledGuard = "/save:quest:observatoryquest-killedguard"
const val attributeUnlockedGate = "/save:quest:observatoryquest-unlockedgate"
const val attributeTelescopeStar = "/save:quest:observatoryquest-telescopestar" // NULL - not seen telescope, 19 - 30 one of the random star patterns
const val attributeReceivedWine = "/save:quest:observatoryquest-receivedwine"
const val attributeReceivedMould = "/save:quest:observatoryquest-receivedmould"
const val attributeRandomChest = "/save:quest:observatoryquest-randomchest"
const val attributeFinishedCutscene = "/save:quest:observatoryquest-finishedcutscene"
}
override fun drawJournal(player: Player, stage: Int) {
super.drawJournal(player, stage)
var line = 12
var stage = getStage(player)
var started = getQuestStage(player, questName) > 0
if (!started) {
line(player, "I can start this quest by speaking to the !!professor?? in the", line++, false)
line(player, "!!Observatory reception, south-west of Ardougne.??", line++, false)
} else {
line(player, "I can start this quest by speaking to the professor in the", line++, true)
line(player, "Observatory reception, south-west of Ardougne.", line++, true)
if (stage >= 5) {
line(player, "I should take the letter the Examiner has given me to the", line++, true)
line(player, "Curator of Varrock Museum, for his approval.", line++, true)
line++
} else if (stage >= 1) {
line(player, "Seems the observatory telescope needs repairing, due to", line++)
line(player, "the nearby goblins. The !!professor?? wants me to help by", line++)
line(player, "getting the following, with the help of his !!assistant??:", line++)
line++
}
if (stage >= 2) {
line(player, "!!3 plain wooden planks??", line++, true)
} else if (stage >= 1) {
line(player, "!!3 plain wooden planks??", line++, inInventory(player, Items.PLANK_960, 3))
}
if (stage >= 3) {
line(player, "!!1 bronze bar??", line++, true)
} else if (stage >= 2) {
line(player, "!!1 bronze bar??", line++, inInventory(player, Items.BRONZE_BAR_2349))
}
if (stage >= 4) {
line(player, "!!1 molten glass??", line++, true)
} else if (stage >= 3) {
line(player, "!!1 molten glass??", line++, inInventory(player, Items.MOLTEN_GLASS_1775))
}
if (stage >= 5) {
line(player, "!!1 lens mould??", line++, true)
} else if (stage >= 4) {
line(player, "!!1 lens mould??", line++)
}
if (stage >= 6) {
line(player, "The professor was pleased to have all the pieces needed", line++, true)
line(player, "to fix the telescope. Apparently, the professor's last", line++, true)
line(player, "attempt at Crafting ended in disaster. So, he wants me to", line++, true)
line(player, "create the lens by using the molten glass with the mould.", line++, true)
line(player, "Fine by me!", line++, true)
} else if (stage >= 5) {
line(player, "The !!professor?? was pleased to have all the pieces needed", line++)
line(player, "to fix the telescope. Apparently, the professor's last", line++)
line(player, "attempt at Crafting ended in disaster. So, he wants me to", line++)
line(player, "create the !!lens?? by using the !!molten glass?? with the !!mould??.", line++)
line(player, "Fine by me!", line++)
}
if (stage >= 100) {
line(player, "The professor has gone ahead to the Observatory. He", line++, true)
line(player, "wants me to meet him there by travelling through the", line++, true)
line(player, "dungeon below it.", line++, true)
} else if (stage >= 6) {
line(player, "The !!professor?? has gone ahead to the !!Observatory??. He", line++)
line(player, "wants me to meet him there by travelling through the", line++)
line(player, "!!dungeon?? below it.", line++)
}
if (stage >= 100) {
line++
line(player,"<col=FF0000>QUEST COMPLETE!</col>", line)
}
}
}
override fun finish(player: Player) {
var ln = 10
super.finish(player)
player.packetDispatch.sendString("You have completed the Observatory Quest!", 277, 4)
// This image is special since it isn't an item, but a standalone model.
player.packetDispatch.sendModelOnInterface(1174, 277, 5, 0) // Scenery 2210, Model 1174
player.packetDispatch.sendAngleOnInterface(277, 5, 2040, 0, 1836)
drawReward(player, "2 Quest Points", ln++)
drawReward(player, "2,250 Crafting XP", ln++)
drawReward(player, "A payment depending on", ln++)
drawReward(player, "which constellation you", ln++)
drawReward(player, "observed", ln++)
rewardXP(player, Skills.CRAFTING, 2250.0)
}
override fun updateVarps(player: Player) {
setVarp(player, observatoryVarp, getQuestStage(player, questName), true)
if(getQuestStage(player, questName) >= 6) {
setVarbit(player, telescopeVarbit, 1, true)
} else {
setVarbit(player, telescopeVarbit, 0, true)
}
if(getQuestStage(player, questName) >= 7) {
setVarp(player, observatoryVarp, 7, true)
}
}
override fun reset(player : Player) {
removeAttribute(player, attributeKilledGuard)
removeAttribute(player, attributeUnlockedGate)
removeAttribute(player, attributeTelescopeStar)
removeAttribute(player, attributeReceivedWine)
removeAttribute(player, attributeReceivedMould)
removeAttribute(player, attributeRandomChest)
removeAttribute(player, attributeFinishedCutscene)
setVarbit(player, 3837, 0, true)
}
override fun newInstance(`object`: Any?): Quest {
return this
}
}

View file

@ -0,0 +1,59 @@
package content.region.kandarin.quest.observatoryquest
import core.api.*
import core.game.interaction.InterfaceListener
import core.game.world.map.Location
class ObservatoryQuestInterfaces : InterfaceListener {
companion object {
val buttonToNameMapping = mapOf(
19 to "Aquarius",
20 to "Aries",
21 to "Cancer",
22 to "Capricorn",
23 to "Gemini",
24 to "Leo",
25 to "Libra",
26 to "Pisces",
27 to "Sagittarius",
28 to "Scorpio",
29 to "Taurus",
30 to "Virgo",
)
val buttonToStarObjectMapping = mapOf(
19 to 27064,
20 to 27066,
21 to 27067,
22 to 27061,
23 to 27068,
24 to 27058,
25 to 27057,
26 to 27062,
27 to 27056,
28 to 27055,
29 to 27059,
30 to 27060,
)
}
override fun defineInterfaceListeners() {
on(ObservatoryQuest.starChartsInterface) { player, component, opcode, buttonID, slot, itemID ->
if(buttonToStarObjectMapping.contains(buttonID)){
// 55 57
player.packetDispatch.sendModelOnInterface(buttonToStarObjectMapping[buttonID]!!, ObservatoryQuest.starChartsInterface, 55, 0)
setInterfaceText(player, buttonToNameMapping[buttonID]!!, ObservatoryQuest.starChartsInterface, 57)
}
return@on true
}
on(ObservatoryQuest.dungeonWarning) { player, _, _, buttonID, _, _ ->
when (buttonID) {
17 -> teleport(player, Location(2355, 9394)).also { closeInterface(player) }
18 -> closeInterface(player)
}
return@on true
}
}
}

View file

@ -0,0 +1,294 @@
package content.region.kandarin.quest.observatoryquest
import content.data.Quests
import content.region.kandarin.quest.observatoryquest.ObservatoryQuest.Companion.attributeFinishedCutscene
import content.region.kandarin.quest.observatoryquest.ObservatoryQuest.Companion.attributeRandomChest
import core.ServerConstants
import core.api.*
import core.game.dialogue.DialogueFile
import core.game.dialogue.FacialExpression
import core.game.global.action.DoorActionHandler
import core.game.interaction.InteractionListener
import core.game.interaction.QueueStrength
import core.game.node.entity.npc.NPC
import core.game.node.entity.skill.Skills
import core.game.world.map.Location
import core.tools.END_DIALOGUE
import core.tools.RandomFunction
import org.rs09.consts.Items
import org.rs09.consts.NPCs
import org.rs09.consts.Scenery
class ObservatoryQuestListeners : InteractionListener {
companion object {
val chestMap = mapOf(
Scenery.CHEST_2191 to Scenery.CHEST_2194,
Scenery.CHEST_25385 to Scenery.CHEST_25386,
Scenery.CHEST_25387 to Scenery.CHEST_25388,
Scenery.CHEST_25389 to Scenery.CHEST_25390,
Scenery.CHEST_25391 to Scenery.CHEST_25392
)
val reverseChestMap = chestMap.map { (k, v) -> v to k }.toMap()
/* Comments show only the default order BEFORE randomization. A randomized
number (0-10) is calculated the first time the player goes down the stairs,
and is then added to the map value modulo 11, rotating the map.
*/
val chestLocations = mapOf(
Location(2333, 9405) to 0, // key
Location(2312, 9400) to 1, // spider
Location(2310, 9374) to 2, // spider
Location(2348, 9383) to 3, // empty
Location(2356, 9380) to 4, // spider
Location(2359, 9376) to 5, // empty
Location(2360, 9366) to 6, // empty
Location(2351, 9361) to 7, // spider
Location(2364, 9355) to 8, // antipoison
Location(2335, 9374) to 9, // spider
Location(2326, 9360) to 10) // empty
}
override fun defineListeners() {
on(Scenery.SIGNPOST_25397, SCENERY, "read") { player, _ ->
openDialogue(player, object : DialogueFile(){
override fun handle(componentID: Int, buttonID: Int) {
val servername = ServerConstants.SERVER_NAME
when(stage){
0 -> sendDialogueLines(player, "~ The Observatory ~", "Step ahead to the reception if you wish to explore $servername's most", "magnificent invention.").also {
stage++
}
1 -> player(FacialExpression.NEUTRAL, "Magnificent invention? I've seen some pretty magnificent", "things in my time. It'll have to be pretty impressive.").also { stage = END_DIALOGUE }
}
}
})
return@on true
}
on(Scenery.ORRERY_25401, SCENERY, "view") { player, _ ->
sendChat(player, "Oooooh, bizarre!")
return@on true
}
on(Scenery.STAIRS_25432, SCENERY, "climb-down") { player, _ ->
openInterface(player, 560)
if (getAttribute(player, attributeRandomChest, null) == null) {
setAttribute(player, attributeRandomChest, RandomFunction.random(11))
}
return@on true
}
// http://youtu.be/Kg84MYXgo-M -> You can always go to the observatory, no matter which stage.
on(Scenery.STAIRS_25429, SCENERY, "climb up") { player, node ->
if (node.location == Location(2335, 9351)) {
if (!getAttribute(player, attributeFinishedCutscene, false) && getQuestStage(player, Quests.OBSERVATORY_QUEST) == 6) {
ObservatoryCutscene(player).start()
}
else teleport(player, Location(2439, 3164))
} else {
teleport(player, Location(2457, 3186))
}
return@on true
}
on(Scenery.STAIRS_25434, SCENERY, "climb-down") { player, _ ->
teleport(player, Location(2335, 9350))
return@on true
}
on(Scenery.STAIRS_25431, SCENERY, "climb-up") { player, _ ->
teleport(player, Location(2443, 3160, 1))
return@on true
}
on(Scenery.STAIRS_25437, SCENERY, "climb-down") { player, _ ->
teleport(player, Location(2444, 3162, 0))
return@on true
}
// All chests
on(chestMap.keys.toIntArray(), SCENERY, "open") { player, node ->
animate(player, 536)
sendMessage(player, "You open the chest.")
chestMap[node.id]?.let { replaceScenery(node as core.game.node.scenery.Scenery, it, 240) }
return@on true
}
on(chestMap.values.toIntArray(), SCENERY, "close") { player, node ->
animate(player, 535)
reverseChestMap[node.id]?.let { replaceScenery(node as core.game.node.scenery.Scenery, it, -1) }
return@on true
}
on(chestMap.values.toIntArray(), SCENERY, "search") { player, node ->
val chest = chestLocations[node.location]?.plus(getAttribute(player, attributeRandomChest, 0))?.mod(11)
when (chest) {
0 -> {
if (inInventory(player, Items.GOBLIN_KITCHEN_KEY_601) || getQuestStage(player, Quests.OBSERVATORY_QUEST) != 4 || getAttribute(player, ObservatoryQuest.attributeUnlockedGate, false)) {
sendMessage(player, "You search the chest.")
sendMessage(player, "The chest is empty.")
} else {
lock(player,2)
queueScript(player, 2, QueueStrength.STRONG) {
if (inInventory(player, Items.GOBLIN_KITCHEN_KEY_601)) {
return@queueScript stopExecuting(player)
}
addItemOrDrop(player, Items.GOBLIN_KITCHEN_KEY_601)
sendItemDialogue(player, Items.GOBLIN_KITCHEN_KEY_601,"You find a kitchen key.")
return@queueScript stopExecuting(player)
}
}
animate(player, 537)
return@on true
}
1, 2, 4, 7, 9 -> {
sendMessage(player, "You search the chest.")
if (findLocalNPC(player, NPCs.POISON_SPIDER_1009) != null) {
sendMessage(player, "The chest is empty.")
animate(player, 537)
return@on true
}
sendMessage(player, "The chest contains a poisonous spider.")
val npc = NPC(NPCs.POISON_SPIDER_1009)
npc.location = player.location
npc.init()
npc.isRespawn = false
npc.moveStep()
npc.face(player)
animate(player, 537)
return@on true
}
8 -> {
sendMessage(player, "You search the chest.")
lock(player,2)
queueScript(player, 2, QueueStrength.STRONG) {
addItemOrDrop(player, Items.ANTIPOISON1_179)
sendMessage(player,"This chest contains some antipoison.")
return@queueScript stopExecuting(player)
}
animate(player, 537)
return@on true
}
else -> {
sendMessage(player, "You search the chest.")
sendMessage(player, "The chest is empty.")
animate(player, 537)
return@on true
}
}
}
on(intArrayOf(Scenery.KITCHEN_GATE_2199, Scenery.KITCHEN_GATE_2200), SCENERY, "open") { player, node ->
if (getAttribute(player, ObservatoryQuest.attributeUnlockedGate, false)) {
DoorActionHandler.handleAutowalkDoor(player, node.asScenery())
} else if (getAttribute(player, ObservatoryQuest.attributeKilledGuard, false)) {
if (removeItem(player, Items.GOBLIN_KITCHEN_KEY_601)) {
sendMessage(player, "The gate unlocks.")
sendMessage(player, "The key is useless now. You discard it.")
setAttribute(player, ObservatoryQuest.attributeUnlockedGate, true)
sendPlayerDialogue(player, "I had better be quick, there may be more guards about.")
DoorActionHandler.handleAutowalkDoor(player, node.asScenery())
} else {
// http://youtu.be/ZkUF-0eonls
sendMessage(player, "The gate is locked.")
}
} else if (getQuestStage(player, Quests.OBSERVATORY_QUEST) >= 4){
sendMessage(player, "If you open the gate, the guard will hear you. You need to get rid of him.")
} else sendMessage(player, "The gate is locked.")
return@on true
}
on(NPCs.SLEEPING_GUARD_6122, NPC, "prod") { player, node ->
if (getQuestStage(player, Quests.OBSERVATORY_QUEST) < 4) {
return@on true
}
sendChat(node as NPC, "Oi, how dare you wake me up!")
transformNpc(node, NPCs.GOBLIN_GUARD_489, 400)
node.attack(player)
return@on true
}
on(Scenery.GOBLIN_STOVE_25440, SCENERY, "inspect") { player, _ ->
openDialogue(player, object : DialogueFile(){
override fun handle(componentID: Int, buttonID: Int) {
when(stage){
0 -> sendDialogueLines(player, "The goblins appear to have been using the lens mould to cook their", "stew!").also { stage++ }
1 -> sendDialogueLines(player, "You shake out its contents and take it with you.").also { animate(player, 537); stage++ }
2 -> end().also {
sendChat(player, "Euuuw, that smells awful!")
setVarbit(player, ObservatoryQuest.goblinStoveVarbit ,1)
addItemOrDrop(player, Items.LENS_MOULD_602)
}
}
}
})
return@on true
}
on(Scenery.GOBLIN_STOVE_25441, SCENERY, "inspect") { player, _ ->
if (!inInventory(player, Items.LENS_MOULD_602)) addItemOrDrop(player, Items.LENS_MOULD_602)
return@on true
}
onUseWith(ITEM, Items.LENS_MOULD_602, Items.MOLTEN_GLASS_1775) { player, _, with ->
if (getStatLevel(player, Skills.CRAFTING) < 10) {
sendMessage(player, "You need a crafting level of 10 to do this.")
return@onUseWith true
}
sendMessage(player, "You pour the molten glass into the mould.")
sendMessage(player, "You clasp it together.")
sendItemDialogue(player, Items.OBSERVATORY_LENS_603, "It has produced a small, convex glass disc.")
if (removeItem(player, with)) {
addItemOrDrop(player, Items.OBSERVATORY_LENS_603)
}
return@onUseWith true
}
on(intArrayOf(Scenery.STAR_CHART_25578, Scenery.STAR_CHART_25579, Scenery.STAR_CHART_25580, Scenery.STAR_CHART_25581, Scenery.STAR_CHART_25582, Scenery.STAR_CHART_25583), SCENERY, "look-at") { player, _ ->
openInterface(player, ObservatoryQuest.starChartsInterface)
return@on true
}
on(intArrayOf(Scenery.TELESCOPE_25438, Scenery.TELESCOPE_25439), SCENERY, "view") { player, _ ->
if (getQuestStage(player, Quests.OBSERVATORY_QUEST) >= 100) {
openDialogue(player, TelescopeDialogue(), NPC(NPCs.OBSERVATORY_PROFESSOR_488))
}
else if (getQuestStage(player, Quests.OBSERVATORY_QUEST) >= 6) {
if (getAttribute<Int?>(player, ObservatoryQuest.attributeTelescopeStar, null) == null) {
setAttribute(player, ObservatoryQuest.attributeTelescopeStar, (19..30).random())
}
val randomStar = getAttribute<Int?>(player, ObservatoryQuest.attributeTelescopeStar, null)
openInterface(player, ObservatoryQuest.telescopeInterface)
player.packetDispatch.sendModelOnInterface(ObservatoryQuestInterfaces.buttonToStarObjectMapping[randomStar]!!, ObservatoryQuest.telescopeInterface, 7, 0)
} else {
sendMessage(player, "The telescope is broken.")
}
return@on true
}
on(intArrayOf(Scenery.DOOR_25526, Scenery.DOOR_25527), SCENERY, "open") { player, _ ->
sendMessage(player, "The door is locked.")
return@on true
}
on(Scenery.GRAVE_OF_SCORPIUS_2211, SCENERY, "read") { player, _ ->
sendMessage(player, "Here lies Scorpius: Only those who have seen beyond the stars may seek his counsel.")
return@on true
}
}
}
class TelescopeDialogue : DialogueFile() {
override fun handle(componentID: Int, buttonID: Int) {
when(stage){
0 -> npcl(FacialExpression.ASKING, "What do you see now?").also { stage++ }
1 -> playerl("I can see a constellation through the telescope. It looks like Scorpio.").also { stage++ }
2 -> npcl("Scorpio? Interesting. How very fitting.").also { stage++ }
3 -> playerl(FacialExpression.ASKING, " What do you mean?").also { stage++ }
4 -> npcl("Scorpius, the founder of all we know relating to astronomy. There's a book about him in the reception. Perhaps you should check it out, you might learn something.").also { stage++ }
5 -> playerl("Then perhaps I shall.").also { stage = END_DIALOGUE }
}
}
}

View file

@ -0,0 +1,20 @@
package content.region.kandarin.quest.observatoryquest
import core.api.getAttribute
import core.api.setAttribute
import core.game.node.entity.npc.NPC
import core.game.node.entity.npc.NPCBehavior
import core.game.world.GameWorld
import org.rs09.consts.NPCs
class PoisonSpiderBehavior : NPCBehavior(NPCs.POISON_SPIDER_1009) {
override fun onCreation(self: NPC) {
setAttribute(self, "despawn-time", GameWorld.ticks + 100)
}
override fun tick(self: NPC): Boolean {
if (getAttribute(self, "despawn-time", 0) <= GameWorld.ticks && !self.inCombat())
self.clear()
return true
}
}

View file

@ -0,0 +1,110 @@
package content.region.kandarin.quest.observatoryquest
import content.data.Quests
import content.region.kandarin.quest.observatoryquest.ObservatoryQuest.Companion.attributeReceivedMould
import core.api.*
import core.game.dialogue.*
import core.game.node.entity.player.Player
import core.game.node.item.Item
import core.plugin.Initializable
import org.rs09.consts.Items
import org.rs09.consts.NPCs
@Initializable
class SpiritOfScorpiusDialogue (player: Player? = null) : DialoguePlugin(player) {
override fun newInstance(player: Player): DialoguePlugin {
return SpiritOfScorpiusDialogue(player)
}
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
openDialogue(player, SpiritOfScorpiusDialogueFile(), npc)
return false
}
override fun getIds(): IntArray {
return intArrayOf(NPCs.SPIRIT_OF_SCORPIUS_492)
}
}
class SpiritOfScorpiusDialogueFile : DialogueLabeller() {
override fun addConversation() {
assignToIds(NPCs.SPIRIT_OF_SCORPIUS_492)
exec { player, npc ->
if (getQuestStage(player, Quests.OBSERVATORY_QUEST) == 100) {
if (!inEquipment(player, Items.GHOSTSPEAK_AMULET_552)) loadLabel(player, "noghostspeak")
else loadLabel(player, "observatoryqueststage100")
} else loadLabel(player, "observatoryquestincomplete")
}
label("observatoryquestincomplete")
line("They seem to be ignoring you.")
label("noghostspeak")
line("This powerful spirit seems capable of speaking to you", "even though you are not wearing an Amulet of Ghostspeak.")
exec { player, _ ->
loadLabel(player, "observatoryqueststage100")
}
label("observatoryqueststage100")
npc("Who treads upon my grave?")
options(
DialogueOption("wisdom", "I seek your wisdom.") { player, _ ->
return@DialogueOption !getAttribute(player, attributeReceivedMould, false)
},
DialogueOption("anothermould", "I need another unholy symbol mould.", "I need another mould for the unholy symbol.") { player, _ ->
return@DialogueOption getAttribute(player, attributeReceivedMould, false)
},
DialogueOption("blessing", "I have come to seek your blessing."),
DialogueOption("killyou", "I have come to kill you.")
)
label("wisdom")
npc("Indeed, I feel you have beheld the far places in the heavens. My Lord instructs me to help you.")
item(Item(Items.UNHOLY_MOULD_1594), "An unholy mould appears in your inventory.")
exec { player, _ ->
addItemOrDrop(player, Items.UNHOLY_MOULD_1594)
setAttribute(player, attributeReceivedMould, true)
}
npc("Here is a mould to make a token for our Lord; a mould for the unholy symbol of Zamorak. Return to me when you desire my blessing.")
label("anothermould")
exec { player, _ ->
if (inInventory(player, Items.UNHOLY_MOULD_1594)) {
loadLabel(player, "hasmould")
}
else {
addItemOrDrop(player, Items.UNHOLY_MOULD_1594)
loadLabel(player, "lostmould")
}
}
label("hasmould")
npc("One you already have, another is not needed. Leave me be.")
label("lostmould")
npc("A lost object is easy to replace. The loss of the affections of our Lord is impossible to forgive.")
label("blessing")
exec { player, _ ->
if (inInventory(player, Items.UNPOWERED_SYMBOL_1722)) {
loadLabel(player, "canbless")
}
else loadLabel(player, "cannotbless")
}
label("canbless")
npc("I see you have the unholy symbol of our Lord. I will bless it for you.")
line("The ghost mutters in a strange voice.", "The unholy symbol throbs with power.")
exec { player, _ ->
removeItem(player, Items.UNPOWERED_SYMBOL_1722)
addItemOrDrop(player, Items.UNHOLY_SYMBOL_1724)
}
npc("The symbol of our Lord has been blessed with power! My master calls.")
label("cannotbless")
npc("No blessing will be given to those who have no symbol of our Lord's love.")
label("killyou")
npc("The might of mortals, to me, is as the dust to the sea.")
}
}

View file

@ -166,6 +166,18 @@ abstract class Cutscene(val player: Player) {
player.dialogueInterpreter.addAction {_,_ -> onContinue.invoke()}
}
/**
* Sends a non-NPC dialogue to the player, which updates the cutscene stage by default when continued
* @param message the message to send
* @param onContinue (optional) a method that runs when the dialogue is "continued." Increments the cutscene stage by default.
*/
fun dialogueLinesUpdate(vararg message: String, onContinue: () -> Unit = {incrementStage()})
{
logCutscene("Sending standard dialogue lines update.")
sendDialogueLines(player, *message)
player.dialogueInterpreter.addAction {_,_ -> onContinue.invoke()}
}
/**
* Sends a player dialogue, which updates the cutscene stage by default when continued
* @param expression the FacialExpression to use