mirror of
https://github.com/islehorse/HISP.git
synced 2025-04-06 05:05:40 +12:00
Update
This commit is contained in:
parent
ed99d8328e
commit
d0b206f388
8 changed files with 746 additions and 245 deletions
|
@ -2,10 +2,18 @@
|
|||
"login_format":"Welcome to the land of Horse Isle, %USERNAME%!!",
|
||||
"motd_format":"<FONT COLOR='#FF0000'><B>Today's Note:</B> %MOTD%</FONT>",
|
||||
"mail_received":"A message has been sent to you from another player. It is in your inventory now.",
|
||||
"area_format":" <I>You are on %AREA% </I><BR>",
|
||||
"nothing_message":"^LYou see nothing on the ground of interest.^R1",
|
||||
"login_message":"Player %USERNAME% has logged in",
|
||||
"logout_message":"Player Tetra has disconnected",
|
||||
"logout_message":"Player %USERNAME% has disconnected",
|
||||
"profile_save":"Your profile changes were saved.",
|
||||
"meta":{
|
||||
"isle_format":" on %ISLE%",
|
||||
"town_format":" in the town %TOWN%",
|
||||
"area_format":" in %AREA%",
|
||||
"location_format":" <I>You are%META% </I>",
|
||||
"tile_format":"<B>%TILENAME%</B>",
|
||||
"nothing_message":"^LYou see nothing on the ground of interest.^R1",
|
||||
"seperator":"<BR>"
|
||||
},
|
||||
"chat":{
|
||||
"for_others":{
|
||||
"global_format":"<FONT COLOR='#880000'><B>%USERNAME%:</B> %MESSAGE%</FONT>",
|
||||
|
@ -35,7 +43,7 @@
|
|||
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1]
|
||||
1,1,1,1,1,1],
|
||||
},
|
||||
"overlay_tiles":{
|
||||
"tile_depth":[3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0,1,1,3,3,3,1,1,1,1,3,3,3,
|
||||
|
@ -56,8 +64,11 @@
|
|||
2,2,2,2,2,2,3,2,1,3,3,2,2,3,3,2,2,2,3,0,0,3,2,2,2,2,2,2,3,3,2,1,1,1,1,1,2,3,3,
|
||||
2,3,3,3,1,2,2,2,1,1,1,1,1,1,1,2,3,3,3,3,3,3,3,3,1,1,1,1,1,3,3,3,3,2,3,3,3,3,3,
|
||||
3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,0,0,3,0,0,0,1,1,2,2,3,2,2,2,2,2,2,
|
||||
3,3,1,1,1,1,3,3,3,3]
|
||||
|
||||
3,3,1,1,1,1,3,3,3,3],
|
||||
|
||||
"meta_names":[
|
||||
"Rock Pile"
|
||||
]
|
||||
}
|
||||
},
|
||||
"new_user":{
|
||||
|
@ -65,124 +76,278 @@
|
|||
"starting_x":523,
|
||||
"starting_y":138
|
||||
},
|
||||
"isles":[
|
||||
{"start_x":613,"end_x":616,"start_y":286,"end_y":288,"tileset":0,"name":"The Neverending Isles"},
|
||||
{"start_x":672,"end_x":675,"start_y":260,"end_y":262,"tileset":0,"name":"Solomon Isle"},
|
||||
{"start_x":618,"end_x":623,"start_y":218,"end_y":222,"tileset":0,"name":"Palm Isle"},
|
||||
{"start_x":687,"end_x":692,"start_y":305,"end_y":311,"tileset":0,"name":"Nonesuch Isle"},
|
||||
{"start_x":638,"end_x":644,"start_y":349,"end_y":354,"tileset":6,"name":"Isle of Hardly"},
|
||||
{"start_x":623,"end_x":628,"start_y":277,"end_y":284,"tileset":0,"name":"The Neverending Isles"},
|
||||
{"start_x":595,"end_x":601,"start_y":195,"end_y":201,"tileset":0,"name":"Talon Isle"},
|
||||
{"start_x":619,"end_x":626,"start_y":291,"end_y":298,"tileset":0,"name":"The Neverending Isles"},
|
||||
{"start_x":670,"end_x":675,"start_y":323,"end_y":334,"tileset":0,"name":"Rock Isle"},
|
||||
{"start_x":638,"end_x":646,"start_y":285,"end_y":292,"tileset":0,"name":"The Neverending Isles"},
|
||||
{"start_x":639,"end_x":647,"start_y":271,"end_y":278,"tileset":0,"name":"The Neverending Isles"},
|
||||
{"start_x":683,"end_x":692,"start_y":320,"end_y":327,"tileset":0,"name":"Spirit Isle"},
|
||||
{"start_x":595,"end_x":606,"start_y":361,"end_y":367,"tileset":5,"name":"Puuhonua Isle"},
|
||||
{"start_x":611,"end_x":621,"start_y":357,"end_y":365,"tileset":0,"name":"Patsy Isle"},
|
||||
{"start_x":617,"end_x":627,"start_y":262,"end_y":270,"tileset":0,"name":"Spice Isle"},
|
||||
{"start_x":669,"end_x":677,"start_y":293,"end_y":303,"tileset":3,"name":"Haven Isle"},
|
||||
{"start_x":399,"end_x":407,"start_y":464,"end_y":475,"tileset":2,"name":"The Sand Isles"},
|
||||
{"start_x":670,"end_x":678,"start_y":304,"end_y":315,"tileset":3,"name":"Half Haven Isle"},
|
||||
{"start_x":674,"end_x":684,"start_y":223,"end_y":232,"tileset":0,"name":"Crazy Eddie's Isle"},
|
||||
{"start_x":640,"end_x":649,"start_y":211,"end_y":221,"tileset":0,"name":"Atropos Isle"},
|
||||
{"start_x":622,"end_x":632,"start_y":353,"end_y":362,"tileset":0,"name":"Patsy Isle"},
|
||||
{"start_x":360,"end_x":372,"start_y":419,"end_y":427,"tileset":2,"name":"The Sand Isles"},
|
||||
{"start_x":625,"end_x":636,"start_y":226,"end_y":235,"tileset":0,"name":"Mare Isle"},
|
||||
{"start_x":626,"end_x":640,"start_y":299,"end_y":309,"tileset":3,"name":"Tranquility Isle"},
|
||||
{"start_x":641,"end_x":650,"start_y":300,"end_y":316,"tileset":0,"name":"Serenity Isle"},
|
||||
{"start_x":626,"end_x":635,"start_y":203,"end_y":219,"tileset":0,"name":"Ardent Isle"},
|
||||
{"start_x":623,"end_x":637,"start_y":335,"end_y":346,"tileset":0,"name":"Drill Isle"},
|
||||
{"start_x":655,"end_x":669,"start_y":294,"end_y":305,"tileset":3,"name":"Haven Isle"},
|
||||
{"start_x":645,"end_x":661,"start_y":405,"end_y":415,"tileset":0,"name":"Aesop Isle"},
|
||||
{"start_x":693,"end_x":704,"start_y":265,"end_y":280,"tileset":0,"name":"Hotzeplotz Isle"},
|
||||
{"start_x":655,"end_x":669,"start_y":306,"end_y":319,"tileset":3,"name":"Haven Isle"},
|
||||
{"start_x":517,"end_x":528,"start_y":127,"end_y":145,"tileset":0,"name":"Welcome Isle"},
|
||||
{"start_x":602,"end_x":619,"start_y":198,"end_y":210,"tileset":0,"name":"Shimmer Isle"},
|
||||
{"start_x":625,"end_x":638,"start_y":313,"end_y":329,"tileset":0,"name":"Lilac Isle"},
|
||||
{"start_x":674,"end_x":685,"start_y":269,"end_y":289,"tileset":0,"name":"Loch Isle"},
|
||||
{"start_x":352,"end_x":374,"start_y":408,"end_y":418,"tileset":2,"name":"The Sand Isles"},
|
||||
{"start_x":433,"end_x":453,"start_y":217,"end_y":228,"tileset":2,"name":"Mane Isle"},
|
||||
{"start_x":677,"end_x":694,"start_y":203,"end_y":216,"tileset":0,"name":"Paradise Isle"},
|
||||
{"start_x":423,"end_x":439,"start_y":229,"end_y":243,"tileset":2,"name":"Mane Isle"},
|
||||
{"start_x":389,"end_x":398,"start_y":449,"end_y":474,"tileset":2,"name":"The Sand Isles"},
|
||||
{"start_x":694,"end_x":709,"start_y":286,"end_y":302,"tileset":0,"name":"Theobroma Isle"},
|
||||
{"start_x":702,"end_x":726,"start_y":23,"end_y":33,"tileset":1,"name":"Icicle Isle"},
|
||||
{"start_x":632,"end_x":647,"start_y":245,"end_y":262,"tileset":0,"name":"Quiet Isle"},
|
||||
{"start_x":705,"end_x":714,"start_y":246,"end_y":277,"tileset":0,"name":"Hotzeplotz Isle"},
|
||||
{"start_x":669,"end_x":695,"start_y":248,"end_y":260,"tileset":0,"name":"Bone Isle"},
|
||||
{"start_x":655,"end_x":674,"start_y":54,"end_y":72,"tileset":1,"name":"Snowball Isle"},
|
||||
{"start_x":550,"end_x":565,"start_y":25,"end_y":48,"tileset":1,"name":"Christmas Isle"},
|
||||
{"start_x":459,"end_x":482,"start_y":181,"end_y":197,"tileset":2,"name":"Mane Isle"},
|
||||
{"start_x":654,"end_x":666,"start_y":252,"end_y":283,"tileset":0,"name":"Crescent Isle"},
|
||||
{"start_x":645,"end_x":670,"start_y":323,"end_y":338,"tileset":0,"name":"Rock Isle"},
|
||||
{"start_x":626,"end_x":639,"start_y":166,"end_y":197,"tileset":0,"name":"Saddle Isle"},
|
||||
{"start_x":62,"end_x":89,"start_y":157,"end_y":173,"tileset":5,"name":"Rain Isle"},
|
||||
{"start_x":690,"end_x":715,"start_y":218,"end_y":236,"tileset":0,"name":"Eldorado Isle"},
|
||||
{"start_x":912,"end_x":935,"start_y":176,"end_y":196,"tileset":7,"name":"Tephra Isle"},
|
||||
{"start_x":384,"end_x":425,"start_y":18,"end_y":30,"tileset":1,"name":"Glacier Isle"},
|
||||
{"start_x":956,"end_x":981,"start_y":255,"end_y":276,"tileset":7,"name":"Scoria Isle"},
|
||||
{"start_x":552,"end_x":573,"start_y":58,"end_y":83,"tileset":1,"name":"Berg Isle"},
|
||||
{"start_x":439,"end_x":470,"start_y":198,"end_y":216,"tileset":2,"name":"Mane Isle"},
|
||||
{"start_x":380,"end_x":401,"start_y":295,"end_y":322,"tileset":0,"name":"Tail Isle"},
|
||||
{"start_x":968,"end_x":994,"start_y":31,"end_y":54,"tileset":3,"name":"Hat Isle"},
|
||||
{"start_x":656,"end_x":686,"start_y":26,"end_y":48,"tileset":1,"name":"Polar Isle"},
|
||||
{"start_x":726,"end_x":749,"start_y":263,"end_y":294,"tileset":0,"name":"Cabin Isle"},
|
||||
{"start_x":606,"end_x":636,"start_y":409,"end_y":433,"tileset":2,"name":"Dust Isle"},
|
||||
{"start_x":651,"end_x":672,"start_y":427,"end_y":463,"tileset":2,"name":"Torrid Isle"},
|
||||
{"start_x":652,"end_x":679,"start_y":215,"end_y":247,"tileset":0,"name":"Bone Isle"},
|
||||
{"start_x":284,"end_x":325,"start_y":372,"end_y":394,"tileset":0,"name":"Tail Isle"},
|
||||
{"start_x":700,"end_x":715,"start_y":145,"end_y":206,"tileset":0,"name":"Saddle Isle"},
|
||||
{"start_x":90,"end_x":117,"start_y":150,"end_y":184,"tileset":5,"name":"Vine Isle"},
|
||||
{"start_x":948,"end_x":994,"start_y":9,"end_y":30,"tileset":3,"name":"Hat Isle"},
|
||||
{"start_x":640,"end_x":661,"start_y":153,"end_y":202,"tileset":0,"name":"Saddle Isle"},
|
||||
{"start_x":326,"end_x":356,"start_y":356,"end_y":391,"tileset":0,"name":"Tail Isle"},
|
||||
{"start_x":529,"end_x":563,"start_y":344,"end_y":378,"tileset":0,"name":"Hoof Isle"},
|
||||
{"start_x":255,"end_x":283,"start_y":350,"end_y":394,"tileset":0,"name":"Tail Isle"},
|
||||
{"start_x":730,"end_x":786,"start_y":295,"end_y":317,"tileset":0,"name":"Cabin Isle"},
|
||||
{"start_x":360,"end_x":388,"start_y":431,"end_y":475,"tileset":2,"name":"The Sand Isles"},
|
||||
{"start_x":589,"end_x":625,"start_y":156,"end_y":191,"tileset":0,"name":"Saddle Isle"},
|
||||
{"start_x":15,"end_x":56,"start_y":15,"end_y":47,"tileset":0,"name":"Prison Isle"},
|
||||
{"start_x":612,"end_x":672,"start_y":435,"end_y":457,"tileset":2,"name":"Torrid Isle"},
|
||||
{"start_x":942,"end_x":981,"start_y":201,"end_y":235,"tileset":7,"name":"Magma Isle"},
|
||||
{"start_x":836,"end_x":879,"start_y":19,"end_y":50,"tileset":3,"name":"Treasure Isle"},
|
||||
{"start_x":616,"end_x":657,"start_y":115,"end_y":152,"tileset":0,"name":"Rider Isle"},
|
||||
{"start_x":48,"end_x":113,"start_y":185,"end_y":210,"tileset":5,"name":"Vine Isle"},
|
||||
{"start_x":317,"end_x":359,"start_y":419,"end_y":459,"tileset":2,"name":"The Sand Isles"},
|
||||
{"start_x":592,"end_x":656,"start_y":458,"end_y":487,"tileset":2,"name":"Torrid Isle"},
|
||||
{"start_x":708,"end_x":754,"start_y":382,"end_y":427,"tileset":7,"name":"Pumice Isle"},
|
||||
{"start_x":553,"end_x":585,"start_y":100,"end_y":170,"tileset":0,"name":"Horn Isle"},
|
||||
{"start_x":348,"end_x":403,"start_y":67,"end_y":108,"tileset":0,"name":"Art Isle"},
|
||||
{"start_x":562,"end_x":615,"start_y":287,"end_y":333,"tileset":0,"name":"Turtle Isle"},
|
||||
{"start_x":338,"end_x":389,"start_y":151,"end_y":201,"tileset":0,"name":"Cat Isle"},
|
||||
{"start_x":357,"end_x":405,"start_y":323,"end_y":380,"tileset":0,"name":"Tail Isle"},
|
||||
{"start_x":743,"end_x":840,"start_y":200,"end_y":230,"tileset":0,"name":"Whorl Isle"},
|
||||
{"start_x":750,"end_x":812,"start_y":246,"end_y":295,"tileset":0,"name":"Cabin Isle"},
|
||||
{"start_x":31,"end_x":94,"start_y":211,"end_y":261,"tileset":5,"name":"Vine Isle"},
|
||||
{"start_x":195,"end_x":254,"start_y":340,"end_y":394,"tileset":0,"name":"Starfish Isle"},
|
||||
{"start_x":126,"end_x":164,"start_y":20,"end_y":105,"tileset":5,"name":"Web Isle"},
|
||||
{"start_x":938,"end_x":985,"start_y":387,"end_y":457,"tileset":7,"name":"Basalt Isle"},
|
||||
{"start_x":662,"end_x":699,"start_y":111,"end_y":200,"tileset":0,"name":"Saddle Isle"},
|
||||
{"start_x":573,"end_x":654,"start_y":33,"end_y":74,"tileset":1,"name":"Ice Isle"},
|
||||
{"start_x":77,"end_x":125,"start_y":35,"end_y":108,"tileset":5,"name":"Web Isle"},
|
||||
{"start_x":450,"end_x":506,"start_y":78,"end_y":143,"tileset":0,"name":"Ring Isle"},
|
||||
{"start_x":275,"end_x":340,"start_y":290,"end_y":354,"tileset":4,"name":"Flower Isle"},
|
||||
{"start_x":293,"end_x":336,"start_y":170,"end_y":271,"tileset":0,"name":"Hare Isle"},
|
||||
{"start_x":391,"end_x":457,"start_y":118,"end_y":185,"tileset":0,"name":"Bird Isle"},
|
||||
{"start_x":657,"end_x":763,"start_y":25,"end_y":68,"tileset":1,"name":"Polar Isle"},
|
||||
{"start_x":843,"end_x":924,"start_y":218,"end_y":288,"tileset":7,"name":"Igneous Isle"},
|
||||
{"start_x":313,"end_x":351,"start_y":335,"end_y":491,"tileset":2,"name":"Yellow Brick Isle"},
|
||||
{"start_x":348,"end_x":412,"start_y":211,"end_y":309,"tileset":0,"name":"Dolphin Isle"},
|
||||
{"start_x":430,"end_x":551,"start_y":15,"end_y":70,"tileset":1,"name":"Snow Isle"},
|
||||
{"start_x":860,"end_x":967,"start_y":35,"end_y":123,"tileset":3,"name":"Pirate Isle"},
|
||||
{"start_x":737,"end_x":848,"start_y":94,"end_y":199,"tileset":0,"name":"Whorl Isle"},
|
||||
{"start_x":108,"end_x":234,"start_y":267,"end_y":361,"tileset":5,"name":"Jungle Isle"},
|
||||
{"start_x":774,"end_x":975,"start_y":287,"end_y":364,"tileset":7,"name":"Lava Isle"},
|
||||
{"start_x":382,"end_x":601,"start_y":407,"end_y":494,"tileset":2,"name":"Desert Isle"},
|
||||
{"start_x":31,"end_x":107,"start_y":79,"end_y":344,"tileset":5,"name":"Dog Isle"},
|
||||
{"start_x":750,"end_x":934,"start_y":364,"end_y":484,"tileset":7,"name":"Lava Isle"},
|
||||
{"start_x":11,"end_x":251,"start_y":366,"end_y":474,"tileset":6,"name":"The Cloud Isles"},
|
||||
{"start_x":409,"end_x":612,"start_y":155,"end_y":371,"tileset":0,"name":"Horse Isle"},
|
||||
{"start_x":108,"end_x":331,"start_y":55,"end_y":266,"tileset":5,"name":"Jungle Isle"}
|
||||
]
|
||||
"places":{
|
||||
"towns":[
|
||||
{"start_x":219,"end_x":221,"start_y":136,"end_y":138,"name":"Tropicton Village"},
|
||||
{"start_x":307,"end_x":310,"start_y":102,"end_y":104,"name":"Rainy Meadows"},
|
||||
{"start_x":605,"end_x":609,"start_y":173,"end_y":176,"name":"Cantle Meadows"},
|
||||
{"start_x":262,"end_x":267,"start_y":367,"end_y":371,"name":"Tail End"},
|
||||
{"start_x":223,"end_x":226,"start_y":153,"end_y":161,"name":"Tropicton"},
|
||||
{"start_x":364,"end_x":372,"start_y":178,"end_y":181,"name":"Whiskerton"},
|
||||
{"start_x":434,"end_x":441,"start_y":443,"end_y":447,"name":"Sandy Meadows"},
|
||||
{"start_x":476,"end_x":481,"start_y":348,"end_y":355,"name":"Sunshine Meadows"},
|
||||
{"start_x":566,"end_x":574,"start_y":224,"end_y":229,"name":"Treeton"},
|
||||
{"start_x":895,"end_x":903,"start_y":89,"end_y":94,"name":"Crossbones Camp"},
|
||||
{"start_x":361,"end_x":373,"start_y":181,"end_y":185,"name":"Whiskerton"},
|
||||
{"start_x":439,"end_x":448,"start_y":171,"end_y":177,"name":"Soaring Meadows"},
|
||||
{"start_x":423,"end_x":433,"start_y":146,"end_y":152,"name":"Wington"},
|
||||
{"start_x":308,"end_x":315,"start_y":186,"end_y":195,"name":"Carrotton"},
|
||||
{"start_x":812,"end_x":822,"start_y":335,"end_y":342,"name":"Ashton"},
|
||||
{"start_x":618,"end_x":630,"start_y":55,"end_y":61,"name":"Crystalton"},
|
||||
{"start_x":631,"end_x":642,"start_y":138,"end_y":145,"name":"Witherton"},
|
||||
{"start_x":550,"end_x":563,"start_y":439,"end_y":445,"name":"Santon"},
|
||||
{"start_x":431,"end_x":440,"start_y":136,"end_y":145,"name":"Wington"},
|
||||
{"start_x":937,"end_x":949,"start_y":331,"end_y":338,"name":"Molten Meadows"},
|
||||
{"start_x":456,"end_x":471,"start_y":31,"end_y":37,"name":"Chillton"},
|
||||
{"start_x":941,"end_x":955,"start_y":53,"end_y":60,"name":"Skullton"},
|
||||
{"start_x":363,"end_x":373,"start_y":87,"end_y":97,"name":"Inkton"},
|
||||
{"start_x":221,"end_x":235,"start_y":162,"end_y":170,"name":"Tropicton"},
|
||||
{"start_x":375,"end_x":388,"start_y":243,"end_y":252,"name":"Flipperton"},
|
||||
{"start_x":536,"end_x":551,"start_y":364,"end_y":372,"name":"Horseshoe Village"},
|
||||
{"start_x":584,"end_x":596,"start_y":302,"end_y":313,"name":"Shellton"},
|
||||
{"start_x":425,"end_x":438,"start_y":323,"end_y":337,"name":"Appleton"},
|
||||
{"start_x":557,"end_x":573,"start_y":230,"end_y":242,"name":"Treeton"},
|
||||
{"start_x":464,"end_x":479,"start_y":414,"end_y":427,"name":"Hotton"},
|
||||
{"start_x":514,"end_x":535,"start_y":170,"end_y":184,"name":"Earton"}
|
||||
],
|
||||
"areas":[
|
||||
{"start_x":472,"end_x":475,"start_y":187,"end_y":188,"name":"Past Its Prime Forest"},
|
||||
{"start_x":314,"end_x":316,"start_y":181,"end_y":184,"name":"Velveteen Forest"},
|
||||
{"start_x":317,"end_x":319,"start_y":184,"end_y":187,"name":"Velveteen Forest"},
|
||||
{"start_x":473,"end_x":477,"start_y":185,"end_y":187,"name":"Past Its Prime Forest"},
|
||||
{"start_x":470,"end_x":474,"start_y":189,"end_y":191,"name":"Past Its Prime Forest"},
|
||||
{"start_x":679,"end_x":683,"start_y":136,"end_y":138,"name":"Mystic Forest"},
|
||||
{"start_x":481,"end_x":484,"start_y":420,"end_y":423,"name":"Toasty Forest"},
|
||||
{"start_x":574,"end_x":576,"start_y":245,"end_y":250,"name":"Muzzle Forest"},
|
||||
{"start_x":378,"end_x":384,"start_y":236,"end_y":238,"name":"Flipper Forest"},
|
||||
{"start_x":457,"end_x":461,"start_y":421,"end_y":424,"name":"Sweltry Forest"},
|
||||
{"start_x":938,"end_x":940,"start_y":66,"end_y":73,"name":"Patch Forest"},
|
||||
{"start_x":359,"end_x":361,"start_y":285,"end_y":292,"name":"Flipper Forest"},
|
||||
{"start_x":372,"end_x":376,"start_y":229,"end_y":233,"name":"Blowhole Forest"},
|
||||
{"start_x":299,"end_x":303,"start_y":222,"end_y":226,"name":"Bunny Hop Forest"},
|
||||
{"start_x":372,"end_x":380,"start_y":239,"end_y":241,"name":"Flipper Forest"},
|
||||
{"start_x":453,"end_x":457,"start_y":204,"end_y":208,"name":"Sea of Sand"},
|
||||
{"start_x":593,"end_x":594,"start_y":232,"end_y":249,"name":"Muzzle Forest"},
|
||||
{"start_x":372,"end_x":381,"start_y":177,"end_y":179,"name":"Catnip Forest"},
|
||||
{"start_x":481,"end_x":487,"start_y":416,"end_y":419,"name":"Toasty Forest"},
|
||||
{"start_x":516,"end_x":518,"start_y":342,"end_y":352,"name":"Tail Forest"},
|
||||
{"start_x":391,"end_x":395,"start_y":83,"end_y":88,"name":"Flower Forest"},
|
||||
{"start_x":325,"end_x":329,"start_y":252,"end_y":257,"name":"Thumper Forest"},
|
||||
{"start_x":368,"end_x":373,"start_y":74,"end_y":78,"name":"Snowy Acres"},
|
||||
{"start_x":654,"end_x":659,"start_y":164,"end_y":168,"name":"Mystic Forest"},
|
||||
{"start_x":419,"end_x":426,"start_y":337,"end_y":340,"name":"Moon Forest"},
|
||||
{"start_x":300,"end_x":303,"start_y":238,"end_y":245,"name":"Bunny Hop Forest"},
|
||||
{"start_x":367,"end_x":369,"start_y":271,"end_y":282,"name":"Flipper Forest"},
|
||||
{"start_x":361,"end_x":372,"start_y":191,"end_y":193,"name":"Catnip Forest"},
|
||||
{"start_x":303,"end_x":315,"start_y":333,"end_y":335,"name":"Dew Forest"},
|
||||
{"start_x":431,"end_x":443,"start_y":350,"end_y":352,"name":"Moon Forest"},
|
||||
{"start_x":378,"end_x":383,"start_y":89,"end_y":94,"name":"Painted Bay"},
|
||||
{"start_x":359,"end_x":364,"start_y":80,"end_y":85,"name":"Sandy Palms"},
|
||||
{"start_x":580,"end_x":584,"start_y":313,"end_y":320,"name":"Shell Forest"},
|
||||
{"start_x":372,"end_x":376,"start_y":254,"end_y":261,"name":"Flipper Forest"},
|
||||
{"start_x":599,"end_x":603,"start_y":304,"end_y":311,"name":"Shell Forest"},
|
||||
{"start_x":324,"end_x":331,"start_y":303,"end_y":307,"name":"Wildflower Forest"},
|
||||
{"start_x":382,"end_x":388,"start_y":342,"end_y":347,"name":"Lost Forest"},
|
||||
{"start_x":600,"end_x":603,"start_y":238,"end_y":248,"name":"Muzzle Forest"},
|
||||
{"start_x":357,"end_x":362,"start_y":186,"end_y":192,"name":"Catnip Forest"},
|
||||
{"start_x":281,"end_x":286,"start_y":300,"end_y":306,"name":"Daisy Forest"},
|
||||
{"start_x":564,"end_x":572,"start_y":244,"end_y":248,"name":"Muzzle Forest"},
|
||||
{"start_x":304,"end_x":308,"start_y":177,"end_y":185,"name":"Velveteen Forest"},
|
||||
{"start_x":301,"end_x":305,"start_y":183,"end_y":191,"name":"Velveteen Forest"},
|
||||
{"start_x":368,"end_x":379,"start_y":187,"end_y":190,"name":"Catnip Forest"},
|
||||
{"start_x":487,"end_x":489,"start_y":347,"end_y":364,"name":"Tail Forest"},
|
||||
{"start_x":355,"end_x":360,"start_y":178,"end_y":185,"name":"Catnip Forest"},
|
||||
{"start_x":597,"end_x":604,"start_y":311,"end_y":316,"name":"Shell Forest"},
|
||||
{"start_x":503,"end_x":506,"start_y":258,"end_y":270,"name":"Mane Forest"},
|
||||
{"start_x":369,"end_x":379,"start_y":172,"end_y":176,"name":"Catnip Forest"},
|
||||
{"start_x":541,"end_x":546,"start_y":355,"end_y":363,"name":"Hoof Forest"},
|
||||
{"start_x":546,"end_x":560,"start_y":225,"end_y":228,"name":"West Treeton Forest"},
|
||||
{"start_x":449,"end_x":460,"start_y":416,"end_y":420,"name":"Sweltry Forest"},
|
||||
{"start_x":519,"end_x":528,"start_y":163,"end_y":168,"name":"Eartip Forest"},
|
||||
{"start_x":428,"end_x":437,"start_y":288,"end_y":293,"name":"Little Appleton Forest"},
|
||||
{"start_x":430,"end_x":438,"start_y":282,"end_y":288,"name":"Little Appleton Forest"},
|
||||
{"start_x":425,"end_x":433,"start_y":233,"end_y":239,"name":"Prickly Spit"},
|
||||
{"start_x":418,"end_x":422,"start_y":325,"end_y":337,"name":"Moon Forest"},
|
||||
{"start_x":553,"end_x":565,"start_y":208,"end_y":212,"name":"West Treeton Forest"},
|
||||
{"start_x":374,"end_x":381,"start_y":180,"end_y":187,"name":"Catnip Forest"},
|
||||
{"start_x":298,"end_x":303,"start_y":227,"end_y":237,"name":"Bunny Hop Forest"},
|
||||
{"start_x":378,"end_x":388,"start_y":348,"end_y":353,"name":"Lost Forest"},
|
||||
{"start_x":932,"end_x":937,"start_y":63,"end_y":74,"name":"Patch Forest"},
|
||||
{"start_x":361,"end_x":389,"start_y":365,"end_y":367,"name":"Lost Forest"},
|
||||
{"start_x":595,"end_x":599,"start_y":235,"end_y":249,"name":"Muzzle Forest"},
|
||||
{"start_x":306,"end_x":313,"start_y":176,"end_y":184,"name":"Velveteen Forest"},
|
||||
{"start_x":679,"end_x":689,"start_y":139,"end_y":145,"name":"Mystic Forest"},
|
||||
{"start_x":431,"end_x":452,"start_y":346,"end_y":349,"name":"Moon Forest"},
|
||||
{"start_x":319,"end_x":332,"start_y":296,"end_y":301,"name":"Wildflower Forest"},
|
||||
{"start_x":483,"end_x":489,"start_y":352,"end_y":363,"name":"Tail Forest"},
|
||||
{"start_x":660,"end_x":670,"start_y":161,"end_y":168,"name":"Mystic Forest"},
|
||||
{"start_x":418,"end_x":428,"start_y":316,"end_y":323,"name":"Moon Forest"},
|
||||
{"start_x":424,"end_x":433,"start_y":294,"end_y":302,"name":"Little Appleton Forest"},
|
||||
{"start_x":747,"end_x":756,"start_y":42,"end_y":50,"name":"Frigid Meadows"},
|
||||
{"start_x":469,"end_x":487,"start_y":230,"end_y":234,"name":"Mane Forest"},
|
||||
{"start_x":474,"end_x":485,"start_y":280,"end_y":287,"name":"Horse Isle Equestrian Park"},
|
||||
{"start_x":421,"end_x":430,"start_y":303,"end_y":312,"name":"Little Appleton Forest"},
|
||||
{"start_x":482,"end_x":489,"start_y":332,"end_y":344,"name":"Tail Forest"},
|
||||
{"start_x":642,"end_x":663,"start_y":190,"end_y":194,"name":"Mystic Forest"},
|
||||
{"start_x":299,"end_x":307,"start_y":192,"end_y":203,"name":"Velveteen Forest"},
|
||||
{"start_x":367,"end_x":390,"start_y":360,"end_y":364,"name":"Lost Forest"},
|
||||
{"start_x":548,"end_x":567,"start_y":219,"end_y":224,"name":"West Treeton Forest"},
|
||||
{"start_x":518,"end_x":534,"start_y":215,"end_y":221,"name":"Big Forest"},
|
||||
{"start_x":370,"end_x":390,"start_y":354,"end_y":359,"name":"Lost Forest"},
|
||||
{"start_x":923,"end_x":931,"start_y":61,"end_y":74,"name":"Patch Forest"},
|
||||
{"start_x":462,"end_x":469,"start_y":237,"end_y":252,"name":"Mane Forest"},
|
||||
{"start_x":643,"end_x":696,"start_y":169,"end_y":171,"name":"Mystic Forest"},
|
||||
{"start_x":356,"end_x":368,"start_y":168,"end_y":177,"name":"Catnip Forest"},
|
||||
{"start_x":512,"end_x":516,"start_y":331,"end_y":359,"name":"Tail Forest"},
|
||||
{"start_x":548,"end_x":571,"start_y":213,"end_y":218,"name":"West Treeton Forest"},
|
||||
{"start_x":587,"end_x":592,"start_y":228,"end_y":251,"name":"Muzzle Forest"},
|
||||
{"start_x":676,"end_x":693,"start_y":146,"end_y":153,"name":"Mystic Forest"},
|
||||
{"start_x":545,"end_x":555,"start_y":229,"end_y":241,"name":"West Treeton Forest"},
|
||||
{"start_x":374,"end_x":386,"start_y":87,"end_y":97,"name":"The Shores of Painted Bay"},
|
||||
{"start_x":584,"end_x":602,"start_y":316,"end_y":323,"name":"Shell Forest"},
|
||||
{"start_x":363,"end_x":371,"start_y":228,"end_y":244,"name":"Flipper Forest"},
|
||||
{"start_x":361,"end_x":367,"start_y":271,"end_y":293,"name":"Flipper Forest"},
|
||||
{"start_x":496,"end_x":502,"start_y":249,"end_y":272,"name":"Mane Forest"},
|
||||
{"start_x":516,"end_x":537,"start_y":207,"end_y":214,"name":"Big Forest"},
|
||||
{"start_x":508,"end_x":512,"start_y":325,"end_y":362,"name":"Tail Forest"},
|
||||
{"start_x":513,"end_x":529,"start_y":222,"end_y":232,"name":"Big Forest"},
|
||||
{"start_x":323,"end_x":330,"start_y":228,"end_y":251,"name":"Thumper Forest"},
|
||||
{"start_x":511,"end_x":539,"start_y":190,"end_y":196,"name":"Big Forest"},
|
||||
{"start_x":631,"end_x":674,"start_y":185,"end_y":189,"name":"Mystic Forest"},
|
||||
{"start_x":420,"end_x":455,"start_y":340,"end_y":345,"name":"Moon Forest"},
|
||||
{"start_x":640,"end_x":651,"start_y":123,"end_y":139,"name":"Bridle Forest"},
|
||||
{"start_x":365,"end_x":372,"start_y":245,"end_y":271,"name":"Flipper Forest"},
|
||||
{"start_x":577,"end_x":586,"start_y":223,"end_y":250,"name":"Muzzle Forest"},
|
||||
{"start_x":293,"end_x":303,"start_y":305,"end_y":330,"name":"Dew Forest"},
|
||||
{"start_x":474,"end_x":495,"start_y":259,"end_y":271,"name":"Mane Forest"},
|
||||
{"start_x":440,"end_x":458,"start_y":322,"end_y":339,"name":"Moon Forest"},
|
||||
{"start_x":671,"end_x":696,"start_y":154,"end_y":168,"name":"Mystic Forest"},
|
||||
{"start_x":304,"end_x":317,"start_y":304,"end_y":332,"name":"Dew Forest"},
|
||||
{"start_x":506,"end_x":551,"start_y":197,"end_y":206,"name":"Big Forest"},
|
||||
{"start_x":290,"end_x":324,"start_y":311,"end_y":324,"name":"Dew Forest"},
|
||||
{"start_x":470,"end_x":495,"start_y":235,"end_y":258,"name":"Mane Forest"},
|
||||
{"start_x":489,"end_x":508,"start_y":322,"end_y":365,"name":"Tail Forest"},
|
||||
{"start_x":614,"end_x":698,"start_y":172,"end_y":184,"name":"Mystic Forest"}
|
||||
],
|
||||
"isles":[
|
||||
{"start_x":613,"end_x":616,"start_y":286,"end_y":288,"tileset":0,"name":"The Neverending Isles"},
|
||||
{"start_x":672,"end_x":675,"start_y":260,"end_y":262,"tileset":0,"name":"Solomon Isle"},
|
||||
{"start_x":618,"end_x":623,"start_y":218,"end_y":222,"tileset":0,"name":"Palm Isle"},
|
||||
{"start_x":687,"end_x":692,"start_y":305,"end_y":311,"tileset":0,"name":"Nonesuch Isle"},
|
||||
{"start_x":638,"end_x":644,"start_y":349,"end_y":354,"tileset":6,"name":"Isle of Hardly"},
|
||||
{"start_x":623,"end_x":628,"start_y":277,"end_y":284,"tileset":0,"name":"The Neverending Isles"},
|
||||
{"start_x":595,"end_x":601,"start_y":195,"end_y":201,"tileset":0,"name":"Talon Isle"},
|
||||
{"start_x":619,"end_x":626,"start_y":291,"end_y":298,"tileset":0,"name":"The Neverending Isles"},
|
||||
{"start_x":670,"end_x":675,"start_y":323,"end_y":334,"tileset":0,"name":"Rock Isle"},
|
||||
{"start_x":638,"end_x":646,"start_y":285,"end_y":292,"tileset":0,"name":"The Neverending Isles"},
|
||||
{"start_x":639,"end_x":647,"start_y":271,"end_y":278,"tileset":0,"name":"The Neverending Isles"},
|
||||
{"start_x":683,"end_x":692,"start_y":320,"end_y":327,"tileset":0,"name":"Spirit Isle"},
|
||||
{"start_x":595,"end_x":606,"start_y":361,"end_y":367,"tileset":5,"name":"Puuhonua Isle"},
|
||||
{"start_x":611,"end_x":621,"start_y":357,"end_y":365,"tileset":0,"name":"Patsy Isle"},
|
||||
{"start_x":617,"end_x":627,"start_y":262,"end_y":270,"tileset":0,"name":"Spice Isle"},
|
||||
{"start_x":669,"end_x":677,"start_y":293,"end_y":303,"tileset":3,"name":"Haven Isle"},
|
||||
{"start_x":399,"end_x":407,"start_y":464,"end_y":475,"tileset":2,"name":"The Sand Isles"},
|
||||
{"start_x":670,"end_x":678,"start_y":304,"end_y":315,"tileset":3,"name":"Half Haven Isle"},
|
||||
{"start_x":674,"end_x":684,"start_y":223,"end_y":232,"tileset":0,"name":"Crazy Eddie's Isle"},
|
||||
{"start_x":640,"end_x":649,"start_y":211,"end_y":221,"tileset":0,"name":"Atropos Isle"},
|
||||
{"start_x":622,"end_x":632,"start_y":353,"end_y":362,"tileset":0,"name":"Patsy Isle"},
|
||||
{"start_x":360,"end_x":372,"start_y":419,"end_y":427,"tileset":2,"name":"The Sand Isles"},
|
||||
{"start_x":625,"end_x":636,"start_y":226,"end_y":235,"tileset":0,"name":"Mare Isle"},
|
||||
{"start_x":626,"end_x":640,"start_y":299,"end_y":309,"tileset":3,"name":"Tranquility Isle"},
|
||||
{"start_x":641,"end_x":650,"start_y":300,"end_y":316,"tileset":0,"name":"Serenity Isle"},
|
||||
{"start_x":626,"end_x":635,"start_y":203,"end_y":219,"tileset":0,"name":"Ardent Isle"},
|
||||
{"start_x":623,"end_x":637,"start_y":335,"end_y":346,"tileset":0,"name":"Drill Isle"},
|
||||
{"start_x":655,"end_x":669,"start_y":294,"end_y":305,"tileset":3,"name":"Haven Isle"},
|
||||
{"start_x":645,"end_x":661,"start_y":405,"end_y":415,"tileset":0,"name":"Aesop Isle"},
|
||||
{"start_x":693,"end_x":704,"start_y":265,"end_y":280,"tileset":0,"name":"Hotzeplotz Isle"},
|
||||
{"start_x":655,"end_x":669,"start_y":306,"end_y":319,"tileset":3,"name":"Haven Isle"},
|
||||
{"start_x":517,"end_x":528,"start_y":127,"end_y":145,"tileset":0,"name":"Welcome Isle"},
|
||||
{"start_x":602,"end_x":619,"start_y":198,"end_y":210,"tileset":0,"name":"Shimmer Isle"},
|
||||
{"start_x":625,"end_x":638,"start_y":313,"end_y":329,"tileset":0,"name":"Lilac Isle"},
|
||||
{"start_x":674,"end_x":685,"start_y":269,"end_y":289,"tileset":0,"name":"Loch Isle"},
|
||||
{"start_x":352,"end_x":374,"start_y":408,"end_y":418,"tileset":2,"name":"The Sand Isles"},
|
||||
{"start_x":433,"end_x":453,"start_y":217,"end_y":228,"tileset":2,"name":"Mane Isle"},
|
||||
{"start_x":677,"end_x":694,"start_y":203,"end_y":216,"tileset":0,"name":"Paradise Isle"},
|
||||
{"start_x":423,"end_x":439,"start_y":229,"end_y":243,"tileset":2,"name":"Mane Isle"},
|
||||
{"start_x":389,"end_x":398,"start_y":449,"end_y":474,"tileset":2,"name":"The Sand Isles"},
|
||||
{"start_x":694,"end_x":709,"start_y":286,"end_y":302,"tileset":0,"name":"Theobroma Isle"},
|
||||
{"start_x":702,"end_x":726,"start_y":23,"end_y":33,"tileset":1,"name":"Icicle Isle"},
|
||||
{"start_x":632,"end_x":647,"start_y":245,"end_y":262,"tileset":0,"name":"Quiet Isle"},
|
||||
{"start_x":705,"end_x":714,"start_y":246,"end_y":277,"tileset":0,"name":"Hotzeplotz Isle"},
|
||||
{"start_x":669,"end_x":695,"start_y":248,"end_y":260,"tileset":0,"name":"Bone Isle"},
|
||||
{"start_x":655,"end_x":674,"start_y":54,"end_y":72,"tileset":1,"name":"Snowball Isle"},
|
||||
{"start_x":550,"end_x":565,"start_y":25,"end_y":48,"tileset":1,"name":"Christmas Isle"},
|
||||
{"start_x":459,"end_x":482,"start_y":181,"end_y":197,"tileset":2,"name":"Mane Isle"},
|
||||
{"start_x":654,"end_x":666,"start_y":252,"end_y":283,"tileset":0,"name":"Crescent Isle"},
|
||||
{"start_x":645,"end_x":670,"start_y":323,"end_y":338,"tileset":0,"name":"Rock Isle"},
|
||||
{"start_x":626,"end_x":639,"start_y":166,"end_y":197,"tileset":0,"name":"Saddle Isle"},
|
||||
{"start_x":62,"end_x":89,"start_y":157,"end_y":173,"tileset":5,"name":"Rain Isle"},
|
||||
{"start_x":690,"end_x":715,"start_y":218,"end_y":236,"tileset":0,"name":"Eldorado Isle"},
|
||||
{"start_x":912,"end_x":935,"start_y":176,"end_y":196,"tileset":7,"name":"Tephra Isle"},
|
||||
{"start_x":384,"end_x":425,"start_y":18,"end_y":30,"tileset":1,"name":"Glacier Isle"},
|
||||
{"start_x":956,"end_x":981,"start_y":255,"end_y":276,"tileset":7,"name":"Scoria Isle"},
|
||||
{"start_x":552,"end_x":573,"start_y":58,"end_y":83,"tileset":1,"name":"Berg Isle"},
|
||||
{"start_x":439,"end_x":470,"start_y":198,"end_y":216,"tileset":2,"name":"Mane Isle"},
|
||||
{"start_x":380,"end_x":401,"start_y":295,"end_y":322,"tileset":0,"name":"Tail Isle"},
|
||||
{"start_x":968,"end_x":994,"start_y":31,"end_y":54,"tileset":3,"name":"Hat Isle"},
|
||||
{"start_x":656,"end_x":686,"start_y":26,"end_y":48,"tileset":1,"name":"Polar Isle"},
|
||||
{"start_x":726,"end_x":749,"start_y":263,"end_y":294,"tileset":0,"name":"Cabin Isle"},
|
||||
{"start_x":606,"end_x":636,"start_y":409,"end_y":433,"tileset":2,"name":"Dust Isle"},
|
||||
{"start_x":651,"end_x":672,"start_y":427,"end_y":463,"tileset":2,"name":"Torrid Isle"},
|
||||
{"start_x":652,"end_x":679,"start_y":215,"end_y":247,"tileset":0,"name":"Bone Isle"},
|
||||
{"start_x":284,"end_x":325,"start_y":372,"end_y":394,"tileset":0,"name":"Tail Isle"},
|
||||
{"start_x":700,"end_x":715,"start_y":145,"end_y":206,"tileset":0,"name":"Saddle Isle"},
|
||||
{"start_x":90,"end_x":117,"start_y":150,"end_y":184,"tileset":5,"name":"Vine Isle"},
|
||||
{"start_x":948,"end_x":994,"start_y":9,"end_y":30,"tileset":3,"name":"Hat Isle"},
|
||||
{"start_x":640,"end_x":661,"start_y":153,"end_y":202,"tileset":0,"name":"Saddle Isle"},
|
||||
{"start_x":326,"end_x":356,"start_y":356,"end_y":391,"tileset":0,"name":"Tail Isle"},
|
||||
{"start_x":529,"end_x":563,"start_y":344,"end_y":378,"tileset":0,"name":"Hoof Isle"},
|
||||
{"start_x":255,"end_x":283,"start_y":350,"end_y":394,"tileset":0,"name":"Tail Isle"},
|
||||
{"start_x":730,"end_x":786,"start_y":295,"end_y":317,"tileset":0,"name":"Cabin Isle"},
|
||||
{"start_x":360,"end_x":388,"start_y":431,"end_y":475,"tileset":2,"name":"The Sand Isles"},
|
||||
{"start_x":589,"end_x":625,"start_y":156,"end_y":191,"tileset":0,"name":"Saddle Isle"},
|
||||
{"start_x":15,"end_x":56,"start_y":15,"end_y":47,"tileset":0,"name":"Prison Isle"},
|
||||
{"start_x":612,"end_x":672,"start_y":435,"end_y":457,"tileset":2,"name":"Torrid Isle"},
|
||||
{"start_x":942,"end_x":981,"start_y":201,"end_y":235,"tileset":7,"name":"Magma Isle"},
|
||||
{"start_x":836,"end_x":879,"start_y":19,"end_y":50,"tileset":3,"name":"Treasure Isle"},
|
||||
{"start_x":616,"end_x":657,"start_y":115,"end_y":152,"tileset":0,"name":"Rider Isle"},
|
||||
{"start_x":48,"end_x":113,"start_y":185,"end_y":210,"tileset":5,"name":"Vine Isle"},
|
||||
{"start_x":317,"end_x":359,"start_y":419,"end_y":459,"tileset":2,"name":"The Sand Isles"},
|
||||
{"start_x":592,"end_x":656,"start_y":458,"end_y":487,"tileset":2,"name":"Torrid Isle"},
|
||||
{"start_x":708,"end_x":754,"start_y":382,"end_y":427,"tileset":7,"name":"Pumice Isle"},
|
||||
{"start_x":553,"end_x":585,"start_y":100,"end_y":170,"tileset":0,"name":"Horn Isle"},
|
||||
{"start_x":348,"end_x":403,"start_y":67,"end_y":108,"tileset":0,"name":"Art Isle"},
|
||||
{"start_x":562,"end_x":615,"start_y":287,"end_y":333,"tileset":0,"name":"Turtle Isle"},
|
||||
{"start_x":338,"end_x":389,"start_y":151,"end_y":201,"tileset":0,"name":"Cat Isle"},
|
||||
{"start_x":357,"end_x":405,"start_y":323,"end_y":380,"tileset":0,"name":"Tail Isle"},
|
||||
{"start_x":743,"end_x":840,"start_y":200,"end_y":230,"tileset":0,"name":"Whorl Isle"},
|
||||
{"start_x":750,"end_x":812,"start_y":246,"end_y":295,"tileset":0,"name":"Cabin Isle"},
|
||||
{"start_x":31,"end_x":94,"start_y":211,"end_y":261,"tileset":5,"name":"Vine Isle"},
|
||||
{"start_x":195,"end_x":254,"start_y":340,"end_y":394,"tileset":0,"name":"Starfish Isle"},
|
||||
{"start_x":126,"end_x":164,"start_y":20,"end_y":105,"tileset":5,"name":"Web Isle"},
|
||||
{"start_x":938,"end_x":985,"start_y":387,"end_y":457,"tileset":7,"name":"Basalt Isle"},
|
||||
{"start_x":662,"end_x":699,"start_y":111,"end_y":200,"tileset":0,"name":"Saddle Isle"},
|
||||
{"start_x":573,"end_x":654,"start_y":33,"end_y":74,"tileset":1,"name":"Ice Isle"},
|
||||
{"start_x":77,"end_x":125,"start_y":35,"end_y":108,"tileset":5,"name":"Web Isle"},
|
||||
{"start_x":450,"end_x":506,"start_y":78,"end_y":143,"tileset":0,"name":"Ring Isle"},
|
||||
{"start_x":275,"end_x":340,"start_y":290,"end_y":354,"tileset":4,"name":"Flower Isle"},
|
||||
{"start_x":293,"end_x":336,"start_y":170,"end_y":271,"tileset":0,"name":"Hare Isle"},
|
||||
{"start_x":391,"end_x":457,"start_y":118,"end_y":185,"tileset":0,"name":"Bird Isle"},
|
||||
{"start_x":657,"end_x":763,"start_y":25,"end_y":68,"tileset":1,"name":"Polar Isle"},
|
||||
{"start_x":843,"end_x":924,"start_y":218,"end_y":288,"tileset":7,"name":"Igneous Isle"},
|
||||
{"start_x":313,"end_x":351,"start_y":335,"end_y":491,"tileset":2,"name":"Yellow Brick Isle"},
|
||||
{"start_x":348,"end_x":412,"start_y":211,"end_y":309,"tileset":0,"name":"Dolphin Isle"},
|
||||
{"start_x":430,"end_x":551,"start_y":15,"end_y":70,"tileset":1,"name":"Snow Isle"},
|
||||
{"start_x":860,"end_x":967,"start_y":35,"end_y":123,"tileset":3,"name":"Pirate Isle"},
|
||||
{"start_x":737,"end_x":848,"start_y":94,"end_y":199,"tileset":0,"name":"Whorl Isle"},
|
||||
{"start_x":108,"end_x":234,"start_y":267,"end_y":361,"tileset":5,"name":"Jungle Isle"},
|
||||
{"start_x":774,"end_x":975,"start_y":287,"end_y":364,"tileset":7,"name":"Lava Isle"},
|
||||
{"start_x":382,"end_x":601,"start_y":407,"end_y":494,"tileset":2,"name":"Desert Isle"},
|
||||
{"start_x":31,"end_x":107,"start_y":79,"end_y":344,"tileset":5,"name":"Dog Isle"},
|
||||
{"start_x":750,"end_x":934,"start_y":364,"end_y":484,"tileset":7,"name":"Lava Isle"},
|
||||
{"start_x":11,"end_x":251,"start_y":366,"end_y":474,"tileset":6,"name":"The Cloud Isles"},
|
||||
{"start_x":409,"end_x":612,"start_y":155,"end_y":371,"tileset":0,"name":"Horse Isle"},
|
||||
{"start_x":108,"end_x":331,"start_y":55,"end_y":266,"tileset":5,"name":"Jungle Isle"}
|
||||
]
|
||||
}
|
||||
}
|
|
@ -19,12 +19,20 @@ namespace Horse_Isle_Server
|
|||
public User LoggedinUser;
|
||||
|
||||
private Thread recvPackets;
|
||||
private Timer updateTimer;
|
||||
|
||||
|
||||
private void updateTimerTick(object state)
|
||||
{
|
||||
Logger.DebugPrint("Sending update packet to "+ LoggedinUser.Username);
|
||||
byte[] updatePacket = PacketBuilder.CreateUpdate();
|
||||
SendPacket(updatePacket);
|
||||
}
|
||||
public void Login(int id)
|
||||
{
|
||||
LoggedinUser = new User(id);
|
||||
LoggedIn = true;
|
||||
|
||||
|
||||
}
|
||||
private void receivePackets()
|
||||
{
|
||||
|
@ -99,6 +107,12 @@ namespace Horse_Isle_Server
|
|||
case PacketBuilder.PACKET_MOVE:
|
||||
Server.OnMovementPacket(this, Packet);
|
||||
break;
|
||||
case PacketBuilder.PACKET_PROFILE:
|
||||
Server.OnProfilePacket(this, Packet);
|
||||
break;
|
||||
case PacketBuilder.PACKET_UPDATE:
|
||||
Server.OnUpdatePacket(this, Packet);
|
||||
break;
|
||||
default:
|
||||
Logger.ErrorPrint("Unimplemented Packet: " + BitConverter.ToString(Packet).Replace('-', ' '));
|
||||
break;
|
||||
|
@ -109,15 +123,26 @@ namespace Horse_Isle_Server
|
|||
public void Disconnect()
|
||||
{
|
||||
Logger.DebugPrint(ClientSocket.RemoteEndPoint + " has Disconnected.");
|
||||
recvPackets.Abort();
|
||||
updateTimer.Dispose();
|
||||
LoggedIn = false;
|
||||
LoggedinUser = null;
|
||||
Server.ConnectedClients.Remove(this);
|
||||
ClientSocket.Close();
|
||||
ClientSocket.Dispose();
|
||||
}
|
||||
|
||||
public void SendPacket(byte[] PacketData)
|
||||
{
|
||||
ClientSocket.Send(PacketData);
|
||||
try
|
||||
{
|
||||
ClientSocket.Send(PacketData);
|
||||
}
|
||||
catch (SocketException e)
|
||||
{
|
||||
Logger.ErrorPrint("Socket exception occured: " + e.Message + " and so it was disconnected.");
|
||||
Disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
public Client(Socket clientSocket)
|
||||
|
@ -126,6 +151,7 @@ namespace Horse_Isle_Server
|
|||
RemoteIp = clientSocket.RemoteEndPoint.ToString();
|
||||
|
||||
Logger.DebugPrint("Client connected @ " + RemoteIp);
|
||||
updateTimer = new Timer(new TimerCallback(updateTimerTick), null, 60 * 1000, 60 * 1000);
|
||||
|
||||
recvPackets = new Thread(() =>
|
||||
{
|
||||
|
|
|
@ -21,30 +21,73 @@ namespace Horse_Isle_Server
|
|||
string jsonData = File.ReadAllText(ConfigReader.GameDataFile);
|
||||
dynamic gameData = JsonConvert.DeserializeObject(jsonData);
|
||||
|
||||
int totalIsles = gameData.isles.Count;
|
||||
// Register Towns
|
||||
int totalTowns = gameData.places.towns.Count;
|
||||
for (int i = 0; i < totalTowns; i++)
|
||||
{
|
||||
|
||||
World.Town town = new World.Town();
|
||||
town.StartX = gameData.places.towns[i].start_x;
|
||||
town.StartY = gameData.places.towns[i].start_y;
|
||||
town.EndX = gameData.places.towns[i].end_x;
|
||||
town.EndY = gameData.places.towns[i].end_y;
|
||||
town.Name = gameData.places.towns[i].name;
|
||||
|
||||
Logger.DebugPrint("Registered Town: " + town.Name + " X " + town.StartX + "-" + town.EndX + " Y " + town.StartY + "-" + town.EndY);
|
||||
World.Towns.Add(town);
|
||||
}
|
||||
|
||||
// Register Areas
|
||||
int totalAreas = gameData.places.towns.Count;
|
||||
for (int i = 0; i < totalAreas; i++)
|
||||
{
|
||||
|
||||
World.Area area = new World.Area();
|
||||
area.StartX = gameData.places.areas[i].start_x;
|
||||
area.StartY = gameData.places.areas[i].start_y;
|
||||
area.EndX = gameData.places.areas[i].end_x;
|
||||
area.EndY = gameData.places.areas[i].end_y;
|
||||
area.Name = gameData.places.areas[i].name;
|
||||
|
||||
Logger.DebugPrint("Registered Area: " + area.Name + " X " + area.StartX + "-" + area.EndX + " Y " + area.StartY + "-" + area.EndY);
|
||||
World.Areas.Add(area);
|
||||
}
|
||||
|
||||
// Register Isles
|
||||
int totalIsles = gameData.places.isles.Count;
|
||||
for(int i = 0; i < totalIsles; i++)
|
||||
{
|
||||
|
||||
World.Isle isle = new World.Isle();
|
||||
isle.StartX = gameData.isles[i].start_x;
|
||||
isle.StartY = gameData.isles[i].start_y;
|
||||
isle.EndX = gameData.isles[i].end_x;
|
||||
isle.EndY = gameData.isles[i].end_y;
|
||||
isle.Tileset = gameData.isles[i].tileset;
|
||||
isle.Name = gameData.isles[i].name;
|
||||
isle.StartX = gameData.places.isles[i].start_x;
|
||||
isle.StartY = gameData.places.isles[i].start_y;
|
||||
isle.EndX = gameData.places.isles[i].end_x;
|
||||
isle.EndY = gameData.places.isles[i].end_y;
|
||||
isle.Tileset = gameData.places.isles[i].tileset;
|
||||
isle.Name = gameData.places.isles[i].name;
|
||||
|
||||
Logger.DebugPrint("Registered Isle: " + isle.Name + " X " + isle.StartX + "-" + isle.EndX + " Y " + isle.StartY + "-" + isle.EndY + " tileset: " + isle.Tileset);
|
||||
World.Isles.Add(isle);
|
||||
}
|
||||
|
||||
|
||||
Messages.NewUserMessage = gameData.new_user.starting_message;
|
||||
Map.NewUserStartX = gameData.new_user.starting_x;
|
||||
Map.NewUserStartY = gameData.new_user.starting_y;
|
||||
|
||||
Messages.LoginFormat = gameData.messages.login_format;
|
||||
Messages.AreaMessage = gameData.messages.area_format;
|
||||
Messages.NothingMessage = gameData.messages.nothing_message;
|
||||
Messages.MotdFormat = gameData.messages.motd_format;
|
||||
Messages.ProfileSavedMessage = gameData.messages.profile_save;
|
||||
|
||||
Messages.IsleFormat = gameData.messages.meta.isle_format;
|
||||
Messages.TownFormat = gameData.messages.meta.town_format;
|
||||
Messages.AreaFormat = gameData.messages.meta.area_format;
|
||||
Messages.LocationFormat = gameData.messages.meta.location_format;
|
||||
|
||||
Messages.Sepeerator = gameData.messages.meta.seperator;
|
||||
|
||||
Messages.TileFormat = gameData.messages.meta.tile_format;
|
||||
Messages.NothingMessage = gameData.messages.meta.nothing_message;
|
||||
|
||||
JArray overlayTileDepth = gameData.tile_paramaters.overlay_tiles.tile_depth;
|
||||
JArray terrainTilePassibility = gameData.tile_paramaters.terrain_tiles.passibility;
|
||||
|
|
|
@ -9,12 +9,20 @@ namespace Horse_Isle_Server
|
|||
class Messages
|
||||
{
|
||||
public static string NewUserMessage;
|
||||
public static string AreaMessage;
|
||||
public static string NothingMessage;
|
||||
public static string LoginFormat;
|
||||
|
||||
public static string MotdFormat;
|
||||
|
||||
public static string ProfileSavedMessage;
|
||||
|
||||
public static string Sepeerator;
|
||||
|
||||
public static string IsleFormat;
|
||||
public static string TownFormat;
|
||||
public static string AreaFormat;
|
||||
public static string LocationFormat;
|
||||
|
||||
public static string TileFormat;
|
||||
public static string NothingMessage;
|
||||
public static string GetMOTD()
|
||||
{
|
||||
return MotdFormat.Replace("%MOTD%", ConfigReader.Motd);
|
||||
|
@ -26,13 +34,17 @@ namespace Horse_Isle_Server
|
|||
|
||||
public static string LocationData(int x, int y)
|
||||
{
|
||||
string locationString = "";
|
||||
string message = "";
|
||||
try
|
||||
{
|
||||
World.Isle isle = World.GetIsle(x, y);
|
||||
message = AreaMessage.Replace("%AREA%", isle.Name);
|
||||
}
|
||||
catch (Exception) { }
|
||||
if(World.InArea(x,y))
|
||||
locationString += AreaFormat.Replace("%AREA%", World.GetArea(x, y).Name);
|
||||
if (World.InTown(x, y))
|
||||
locationString += TownFormat.Replace("%TOWN%", World.GetTown(x, y).Name);
|
||||
if (World.InIsle(x, y))
|
||||
locationString += IsleFormat.Replace("%ISLE%", World.GetIsle(x, y).Name);
|
||||
|
||||
if(locationString != "")
|
||||
message += LocationFormat.Replace("%META%", locationString);
|
||||
|
||||
int[] itemIds = World.GetDroppedItems(x, y);
|
||||
if (itemIds.Length == 0)
|
||||
|
|
|
@ -12,7 +12,7 @@ namespace Horse_Isle_Server
|
|||
|
||||
public const byte PACKET_TERMINATOR = 0x00;
|
||||
public const byte PACKET_A_TERMINATOR = 0x0A;
|
||||
|
||||
|
||||
|
||||
public const byte PACKET_LOGIN = 0x7F;
|
||||
public const byte PACKET_CHAT = 0x14;
|
||||
|
@ -24,8 +24,16 @@ namespace Horse_Isle_Server
|
|||
public const byte PACKET_AREA_DEFS = 0x79;
|
||||
public const byte PACKET_ANNOUNCEMENT = 0x7E;
|
||||
public const byte PACKET_TILE_FLAGS = 0x75;
|
||||
public const byte PACKET_UPDATE = 0x7C;
|
||||
public const byte PACKET_PROFILE = 0x18;
|
||||
|
||||
public const byte VIEW_PROFILE = 0x14;
|
||||
public const byte SAVE_PROFILE = 0x15;
|
||||
|
||||
public const byte AREA_SEPERATOR = 0x5E;
|
||||
public const byte AREA_TOWN = 0x54;
|
||||
public const byte AREA_AREA = 0x41;
|
||||
public const byte AREA_ISLE = 0x49;
|
||||
|
||||
public const byte MOVE_UP = 0x14;
|
||||
public const byte MOVE_DOWN = 0x15;
|
||||
|
@ -65,6 +73,23 @@ namespace Horse_Isle_Server
|
|||
return Packet;
|
||||
}
|
||||
|
||||
public static byte[] CreateProfilePacket(string userProfile)
|
||||
{
|
||||
MemoryStream ms = new MemoryStream();
|
||||
|
||||
ms.WriteByte(PACKET_PROFILE);
|
||||
|
||||
byte[] strBytes = Encoding.UTF8.GetBytes(userProfile);
|
||||
ms.Write(strBytes, 0x00, strBytes.Length);
|
||||
|
||||
ms.WriteByte(PACKET_TERMINATOR);
|
||||
ms.Seek(0x00, SeekOrigin.Begin);
|
||||
byte[] Packet = ms.ToArray();
|
||||
ms.Dispose();
|
||||
|
||||
return Packet;
|
||||
}
|
||||
|
||||
public static byte[] CreateMovementPacket(int x, int y,int charId,int facing, int direction, bool walk)
|
||||
{
|
||||
// Header information
|
||||
|
@ -96,7 +121,6 @@ namespace Horse_Isle_Server
|
|||
int ystart = y - 4;
|
||||
int xstart = x - 6;
|
||||
|
||||
|
||||
if (direction == DIRECTION_UP)
|
||||
{
|
||||
for (int relx = 0; relx <= 12; relx++)
|
||||
|
@ -104,13 +128,19 @@ namespace Horse_Isle_Server
|
|||
int tileId = Map.GetTileId(xstart + relx, ystart, false);
|
||||
int otileId = Map.GetTileId(xstart + relx, ystart, true);
|
||||
|
||||
|
||||
if (tileId >= 190)
|
||||
{
|
||||
ms.WriteByte((byte)190);
|
||||
tileId -= 100;
|
||||
}
|
||||
ms.WriteByte((byte)tileId);
|
||||
if (tileId == 190)
|
||||
ms.WriteByte((byte)0x5B);
|
||||
|
||||
if (otileId >= 190)
|
||||
{
|
||||
ms.WriteByte((byte)190);
|
||||
otileId -= 100;
|
||||
}
|
||||
ms.WriteByte((byte)otileId);
|
||||
if (otileId == 190)
|
||||
ms.WriteByte((byte)0x5A);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -122,12 +152,20 @@ namespace Horse_Isle_Server
|
|||
int otileId = Map.GetTileId(xstart, ystart + rely, true);
|
||||
|
||||
|
||||
|
||||
if (tileId >= 190)
|
||||
{
|
||||
ms.WriteByte((byte)190);
|
||||
tileId -= 100;
|
||||
}
|
||||
ms.WriteByte((byte)tileId);
|
||||
if (tileId == 190)
|
||||
ms.WriteByte((byte)0x5B);
|
||||
|
||||
if (otileId >= 190)
|
||||
{
|
||||
ms.WriteByte((byte)190);
|
||||
otileId -= 100;
|
||||
}
|
||||
ms.WriteByte((byte)otileId);
|
||||
if (otileId == 190)
|
||||
ms.WriteByte((byte)0x5A);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -140,12 +178,19 @@ namespace Horse_Isle_Server
|
|||
int otileId = Map.GetTileId(xstart + 12, ystart + rely, true);
|
||||
|
||||
|
||||
if (tileId >= 190)
|
||||
{
|
||||
ms.WriteByte((byte)190);
|
||||
tileId -= 100;
|
||||
}
|
||||
ms.WriteByte((byte)tileId);
|
||||
if (tileId == 190)
|
||||
ms.WriteByte((byte)0x5B);
|
||||
|
||||
if (otileId >= 190)
|
||||
{
|
||||
ms.WriteByte((byte)190);
|
||||
otileId -= 100;
|
||||
}
|
||||
ms.WriteByte((byte)otileId);
|
||||
if (otileId == 190)
|
||||
ms.WriteByte((byte)0x5A);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -157,12 +202,19 @@ namespace Horse_Isle_Server
|
|||
int otileId = Map.GetTileId(xstart + relx, ystart + 9, true);
|
||||
|
||||
|
||||
if (tileId >= 190)
|
||||
{
|
||||
ms.WriteByte((byte)190);
|
||||
tileId -= 100;
|
||||
}
|
||||
ms.WriteByte((byte)tileId);
|
||||
if (tileId == 190)
|
||||
ms.WriteByte((byte)0x5B);
|
||||
|
||||
if (otileId >= 190)
|
||||
{
|
||||
ms.WriteByte((byte)190);
|
||||
otileId -= 100;
|
||||
}
|
||||
ms.WriteByte((byte)otileId);
|
||||
if (otileId == 190)
|
||||
ms.WriteByte((byte)0x5A);
|
||||
}
|
||||
}
|
||||
if (direction == DIRECTION_LOGIN)
|
||||
|
@ -174,14 +226,20 @@ namespace Horse_Isle_Server
|
|||
int tileId = Map.GetTileId(xstart + relx, ystart + rely, false);
|
||||
int otileId = Map.GetTileId(xstart + relx, ystart + rely, true);
|
||||
|
||||
|
||||
if(tileId >= 190)
|
||||
{
|
||||
ms.WriteByte((byte)190);
|
||||
tileId -= 100;
|
||||
}
|
||||
ms.WriteByte((byte)tileId);
|
||||
if (tileId == 190)
|
||||
ms.WriteByte((byte)0x5B);
|
||||
|
||||
if (otileId >= 190)
|
||||
{
|
||||
ms.WriteByte((byte)190);
|
||||
otileId -= 100;
|
||||
}
|
||||
ms.WriteByte((byte)otileId);
|
||||
if (otileId == 190)
|
||||
ms.WriteByte((byte)0x5A);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -193,8 +251,7 @@ namespace Horse_Isle_Server
|
|||
byte[] Packet = ms.ToArray();
|
||||
ms.Dispose();
|
||||
|
||||
Logger.DebugPrint(BitConverter.ToString(Packet).Replace('-', ' '));
|
||||
|
||||
//Logger.DebugPrint(BitConverter.ToString(Packet).Replace("-", " "));
|
||||
return Packet;
|
||||
}
|
||||
|
||||
|
@ -262,15 +319,82 @@ namespace Horse_Isle_Server
|
|||
return Packet;
|
||||
}
|
||||
|
||||
public static byte[] CreateIsleData(World.Isle[] isles)
|
||||
public static byte[] CreateUpdate()
|
||||
{
|
||||
MemoryStream ms = new MemoryStream();
|
||||
|
||||
ms.WriteByte(PACKET_UPDATE);
|
||||
ms.WriteByte(PACKET_TERMINATOR);
|
||||
|
||||
ms.Seek(0x00, SeekOrigin.Begin);
|
||||
byte[] Packet = ms.ToArray();
|
||||
ms.Dispose();
|
||||
|
||||
return Packet;
|
||||
}
|
||||
public static byte[] CreatePlaceData(World.Isle[] isles, World.Town[] towns, World.Area[] areas)
|
||||
{
|
||||
MemoryStream ms = new MemoryStream();
|
||||
ms.WriteByte(PACKET_AREA_DEFS);
|
||||
foreach(World.Isle isle in isles)
|
||||
|
||||
// Write Towns
|
||||
|
||||
foreach (World.Town town in towns)
|
||||
{
|
||||
byte[] strBytes = Encoding.UTF8.GetBytes(town.Name);
|
||||
|
||||
ms.WriteByte(AREA_SEPERATOR);
|
||||
ms.WriteByte(AREA_TOWN);
|
||||
|
||||
ms.WriteByte((byte)(((town.StartX - 4) / 64) + 20));
|
||||
ms.WriteByte((byte)(((town.StartX - 4) % 64) + 20));
|
||||
|
||||
ms.WriteByte((byte)(((town.EndX - 4) / 64) + 20));
|
||||
ms.WriteByte((byte)(((town.EndX - 4) % 64) + 20));
|
||||
|
||||
ms.WriteByte((byte)(((town.StartY - 1) / 64) + 20));
|
||||
ms.WriteByte((byte)(((town.StartY - 1) % 64) + 20));
|
||||
|
||||
ms.WriteByte((byte)(((town.EndY - 1) / 64) + 20));
|
||||
ms.WriteByte((byte)(((town.EndY - 1) % 64) + 20));
|
||||
|
||||
|
||||
ms.Write(strBytes, 0x00, strBytes.Length);
|
||||
}
|
||||
|
||||
// Write Areas
|
||||
|
||||
foreach (World.Area area in areas)
|
||||
{
|
||||
byte[] strBytes = Encoding.UTF8.GetBytes(area.Name);
|
||||
|
||||
ms.WriteByte(AREA_SEPERATOR);
|
||||
ms.WriteByte(AREA_AREA);
|
||||
|
||||
ms.WriteByte((byte)(((area.StartX - 4) / 64) + 20));
|
||||
ms.WriteByte((byte)(((area.StartX - 4) % 64) + 20));
|
||||
|
||||
ms.WriteByte((byte)(((area.EndX - 4) / 64) + 20));
|
||||
ms.WriteByte((byte)(((area.EndX - 4) % 64) + 20));
|
||||
|
||||
ms.WriteByte((byte)(((area.StartY - 1) / 64) + 20));
|
||||
ms.WriteByte((byte)(((area.StartY - 1) % 64) + 20));
|
||||
|
||||
ms.WriteByte((byte)(((area.EndY - 1) / 64) + 20));
|
||||
ms.WriteByte((byte)(((area.EndY - 1) % 64) + 20));
|
||||
|
||||
|
||||
ms.Write(strBytes, 0x00, strBytes.Length);
|
||||
}
|
||||
|
||||
// Write Isles
|
||||
|
||||
foreach (World.Isle isle in isles)
|
||||
{
|
||||
byte[] strBytes = Encoding.UTF8.GetBytes(isle.Name);
|
||||
|
||||
ms.WriteByte(AREA_SEPERATOR);
|
||||
ms.WriteByte(AREA_ISLE);
|
||||
|
||||
ms.WriteByte((byte)(((isle.StartX - 4) / 64) + 20));
|
||||
ms.WriteByte((byte)(((isle.StartX - 4) % 64) + 20));
|
||||
|
@ -394,49 +518,5 @@ namespace Horse_Isle_Server
|
|||
return CreateChat(formattedStr, CHAT_BOTTOM_RIGHT);
|
||||
}
|
||||
|
||||
public static byte[] CreateUserInfo(Client client)
|
||||
{
|
||||
MemoryStream ms = new MemoryStream();
|
||||
if(!client.LoggedIn)
|
||||
throw new Exception("Client is not logged in.");
|
||||
User user = client.LoggedinUser;
|
||||
|
||||
byte[] MovementPacket = CreateMovementPacket(user.X, user.Y, user.CharacterId, DIRECTION_DOWN, DIRECTION_LOGIN, true);
|
||||
ms.Write(MovementPacket, 0x00, MovementPacket.Length);
|
||||
|
||||
byte[] LoginMessage = CreateLoginMessage(user.Username);
|
||||
ms.Write(LoginMessage, 0x00, LoginMessage.Length);
|
||||
|
||||
World.Time time = World.GetGameTime();
|
||||
int timestamp = time.hours * 60;
|
||||
timestamp += time.minutes;
|
||||
|
||||
byte[] WorldData = CreateWorldData(timestamp, time.days, time.year, World.GetWeather());
|
||||
ms.Write(WorldData, 0x00, WorldData.Length);
|
||||
|
||||
byte[] SecCodePacket = CreateSecCode(user.SecCodeSeeds, user.SecCodeInc, user.Administrator, user.Moderator);
|
||||
ms.Write(SecCodePacket, 0x00, SecCodePacket.Length);
|
||||
|
||||
byte[] BaseStatsPacketData = CreateBaseStats(user.Money, Server.GetNumberOfPlayers(), user.MailBox.MailCount);
|
||||
ms.Write(BaseStatsPacketData, 0x00, BaseStatsPacketData.Length);
|
||||
|
||||
byte[] AreaMessage = CreateAreaMessage(user.X,user.Y);
|
||||
ms.Write(AreaMessage, 0x00, AreaMessage.Length);
|
||||
|
||||
byte[] IsleData = CreateIsleData(World.Isles.ToArray());
|
||||
ms.Write(IsleData, 0x00, IsleData.Length);
|
||||
|
||||
byte[] TileFlags = CreateTileOverlayFlags(Map.OverlayTileDepth);
|
||||
ms.Write(TileFlags, 0x00, TileFlags.Length);
|
||||
|
||||
byte[] MotdData = CreateMotd();
|
||||
ms.Write(MotdData, 0x00, MotdData.Length);
|
||||
|
||||
ms.Seek(0x00, SeekOrigin.Begin);
|
||||
byte[] Packet = ms.ToArray();
|
||||
ms.Dispose();
|
||||
|
||||
return Packet;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,27 +10,6 @@ namespace Horse_Isle_Server
|
|||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
/*
|
||||
Bitmap mbmp = new Bitmap("MapData.bmp");
|
||||
Bitmap bmp = new Bitmap("oMapData.bmp");
|
||||
Console.WriteLine(bmp.PixelFormat);
|
||||
Bitmap bbmp = new Bitmap(bmp.Width, bmp.Height, PixelFormat.Format24bppRgb);
|
||||
for(int x = 0; x < bmp.Width; x++)
|
||||
{
|
||||
for(int y = 0; y < bmp.Height; y++)
|
||||
{
|
||||
Color col = mbmp.GetPixel(x, y);
|
||||
Color col2 = bmp.GetPixel(x, y);
|
||||
|
||||
bbmp.SetPixel(x,y,Color.FromArgb(col2.B, 0, col.B));
|
||||
|
||||
}
|
||||
}
|
||||
bbmp.Save("MapData2.bmp", ImageFormat.Bmp);
|
||||
Console.WriteLine("image checked");
|
||||
*/
|
||||
|
||||
|
||||
|
||||
Directory.SetCurrentDirectory(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location));
|
||||
ConfigReader.OpenConfig();
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
|
@ -30,9 +31,112 @@ namespace Horse_Isle_Server
|
|||
Logger.ErrorPrint(sender.RemoteIp + " Requested user information when not logged in.");
|
||||
return;
|
||||
}
|
||||
Logger.DebugPrint(sender.LoggedinUser.Username + " Requesting user information.");
|
||||
byte[] userInfoPackets = PacketBuilder.CreateUserInfo(sender);
|
||||
sender.SendPacket(userInfoPackets);
|
||||
Logger.DebugPrint(sender.LoggedinUser.Username + " Requested user information.");
|
||||
MemoryStream ms = new MemoryStream();
|
||||
User user = sender.LoggedinUser;
|
||||
|
||||
byte[] MovementPacket = PacketBuilder.CreateMovementPacket(user.X, user.Y, user.CharacterId, PacketBuilder.DIRECTION_DOWN, PacketBuilder.DIRECTION_LOGIN, true);
|
||||
ms.Write(MovementPacket, 0x00, MovementPacket.Length);
|
||||
|
||||
byte[] LoginMessage = PacketBuilder.CreateLoginMessage(user.Username);
|
||||
ms.Write(LoginMessage, 0x00, LoginMessage.Length);
|
||||
|
||||
World.Time time = World.GetGameTime();
|
||||
int timestamp = time.hours * 60;
|
||||
timestamp += time.minutes;
|
||||
|
||||
byte[] WorldData = PacketBuilder.CreateWorldData(timestamp, time.days, time.year, World.GetWeather());
|
||||
ms.Write(WorldData, 0x00, WorldData.Length);
|
||||
|
||||
byte[] SecCodePacket = PacketBuilder.CreateSecCode(user.SecCodeSeeds, user.SecCodeInc, user.Administrator, user.Moderator);
|
||||
ms.Write(SecCodePacket, 0x00, SecCodePacket.Length);
|
||||
|
||||
byte[] BaseStatsPacketData = PacketBuilder.CreateBaseStats(user.Money, Server.GetNumberOfPlayers(), user.MailBox.MailCount);
|
||||
ms.Write(BaseStatsPacketData, 0x00, BaseStatsPacketData.Length);
|
||||
|
||||
byte[] AreaMessage = PacketBuilder.CreateAreaMessage(user.X, user.Y);
|
||||
ms.Write(AreaMessage, 0x00, AreaMessage.Length);
|
||||
|
||||
byte[] IsleData = PacketBuilder.CreatePlaceData(World.Isles.ToArray(), World.Towns.ToArray(), World.Areas.ToArray());
|
||||
ms.Write(IsleData, 0x00, IsleData.Length);
|
||||
|
||||
byte[] TileFlags = PacketBuilder.CreateTileOverlayFlags(Map.OverlayTileDepth);
|
||||
ms.Write(TileFlags, 0x00, TileFlags.Length);
|
||||
|
||||
byte[] MotdData = PacketBuilder.CreateMotd();
|
||||
ms.Write(MotdData, 0x00, MotdData.Length);
|
||||
|
||||
ms.Seek(0x00, SeekOrigin.Begin);
|
||||
byte[] Packet = ms.ToArray();
|
||||
ms.Dispose();
|
||||
|
||||
sender.SendPacket(Packet);
|
||||
}
|
||||
public static void OnUpdatePacket(Client sender, byte[] packet)
|
||||
{
|
||||
if (!sender.LoggedIn)
|
||||
{
|
||||
Logger.ErrorPrint(sender.RemoteIp + " Requested user information when not logged in.");
|
||||
return;
|
||||
}
|
||||
if (packet.Length < 2)
|
||||
{
|
||||
Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid Update Packet");
|
||||
return;
|
||||
}
|
||||
|
||||
if(packet[1] == PacketBuilder.PACKET_A_TERMINATOR)
|
||||
{
|
||||
Logger.DebugPrint(sender.LoggedinUser.Username + " Requested latest statistics (Money/Playercount/Mail)");
|
||||
byte[] packetResponse = PacketBuilder.CreateBaseStats(sender.LoggedinUser.Money, GetNumberOfPlayers(), sender.LoggedinUser.MailBox.MailCount);
|
||||
sender.SendPacket(packetResponse);
|
||||
}
|
||||
}
|
||||
public static void OnProfilePacket(Client sender, byte[] packet)
|
||||
{
|
||||
if (!sender.LoggedIn)
|
||||
{
|
||||
Logger.ErrorPrint(sender.RemoteIp + " Requested to change profile page when not logged in.");
|
||||
return;
|
||||
}
|
||||
if(packet.Length < 2)
|
||||
{
|
||||
Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid Profile Packet");
|
||||
return;
|
||||
}
|
||||
|
||||
byte method = packet[1];
|
||||
if(method == PacketBuilder.VIEW_PROFILE)
|
||||
{
|
||||
byte[] profilePacket = PacketBuilder.CreateProfilePacket(sender.LoggedinUser.ProfilePage);
|
||||
sender.SendPacket(profilePacket);
|
||||
}
|
||||
else if(method == PacketBuilder.SAVE_PROFILE)
|
||||
{
|
||||
|
||||
string packetStr = Encoding.UTF8.GetString(packet);
|
||||
if (packet.Length < 3 || !packetStr.Contains('|'))
|
||||
{
|
||||
Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid Profile SAVE Packet");
|
||||
return;
|
||||
}
|
||||
|
||||
int characterId = (packet[2] - 20) * 64 + (packet[3] - 20);
|
||||
|
||||
string profilePage = packetStr.Split('|')[1];
|
||||
profilePage = profilePage.Substring(0, profilePage.Length - 2);
|
||||
|
||||
sender.LoggedinUser.CharacterId = characterId;
|
||||
sender.LoggedinUser.ProfilePage = profilePage;
|
||||
|
||||
Logger.DebugPrint(sender.LoggedinUser.Username + " Changed to character id: " + characterId + " and set there Profile Description to '" + profilePage + "'");
|
||||
|
||||
byte[] chatPacket = PacketBuilder.CreateChat(Messages.ProfileSavedMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
|
||||
sender.SendPacket(chatPacket);
|
||||
|
||||
UpdateArea(sender);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static void OnMovementPacket(Client sender, byte[] packet)
|
||||
|
@ -104,10 +208,10 @@ namespace Horse_Isle_Server
|
|||
|
||||
}
|
||||
|
||||
UpdateArea(sender);
|
||||
|
||||
byte[] tileData = PacketBuilder.CreateAreaMessage(loggedInUser.X, loggedInUser.Y);
|
||||
sender.SendPacket(tileData);
|
||||
}
|
||||
|
||||
public static void OnLoginRequest(Client sender, byte[] packet)
|
||||
{
|
||||
Logger.DebugPrint("Login request received from: " + sender.RemoteIp);
|
||||
|
@ -154,6 +258,14 @@ namespace Horse_Isle_Server
|
|||
|
||||
}
|
||||
|
||||
public static void UpdateArea(Client forClient)
|
||||
{
|
||||
|
||||
byte[] areaData = PacketBuilder.CreateAreaMessage(forClient.LoggedinUser.X, forClient.LoggedinUser.Y);
|
||||
forClient.SendPacket(areaData);
|
||||
|
||||
}
|
||||
|
||||
public static int GetNumberOfPlayers()
|
||||
{
|
||||
int count = 0;
|
||||
|
|
|
@ -18,7 +18,24 @@ namespace Horse_Isle_Server
|
|||
public int Tileset;
|
||||
public string Name;
|
||||
}
|
||||
|
||||
public struct Town
|
||||
{
|
||||
public int StartX;
|
||||
public int EndX;
|
||||
public int StartY;
|
||||
public int EndY;
|
||||
public string Name;
|
||||
}
|
||||
public struct Area
|
||||
{
|
||||
public int StartX;
|
||||
public int EndX;
|
||||
public int StartY;
|
||||
public int EndY;
|
||||
public string Name;
|
||||
}
|
||||
|
||||
|
||||
public struct Time
|
||||
{
|
||||
public int minutes;
|
||||
|
@ -29,6 +46,8 @@ namespace Horse_Isle_Server
|
|||
public const int MINUTE = 4320;
|
||||
|
||||
public static List<Isle> Isles = new List<Isle>();
|
||||
public static List<Town> Towns = new List<Town>();
|
||||
public static List<Area> Areas = new List<Area>();
|
||||
public static Time GetGameTime()
|
||||
{
|
||||
int epoch = Database.GetServerCreationTime();
|
||||
|
@ -54,7 +73,45 @@ namespace Horse_Isle_Server
|
|||
return time;
|
||||
}
|
||||
|
||||
public static bool InArea(int x, int y)
|
||||
{
|
||||
try
|
||||
{
|
||||
GetArea(x, y);
|
||||
return true;
|
||||
}
|
||||
catch (KeyNotFoundException)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static bool InTown(int x, int y)
|
||||
{
|
||||
try
|
||||
{
|
||||
GetTown(x, y);
|
||||
return true;
|
||||
}
|
||||
catch (KeyNotFoundException)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static bool InIsle(int x, int y)
|
||||
{
|
||||
try
|
||||
{
|
||||
GetIsle(x, y);
|
||||
return true;
|
||||
}
|
||||
catch(KeyNotFoundException)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
public static Isle GetIsle(int x, int y)
|
||||
{
|
||||
foreach(Isle isle in Isles)
|
||||
|
@ -67,6 +124,33 @@ namespace Horse_Isle_Server
|
|||
}
|
||||
throw new KeyNotFoundException("x,y not in an isle!");
|
||||
}
|
||||
|
||||
public static Area GetArea(int x, int y)
|
||||
{
|
||||
foreach (Area area in Areas)
|
||||
{
|
||||
|
||||
if (area.StartX <= x && area.EndX >= x && area.StartY <= y && area.EndY >= y)
|
||||
{
|
||||
return area;
|
||||
}
|
||||
}
|
||||
throw new KeyNotFoundException("x,y not in an area!");
|
||||
}
|
||||
|
||||
public static Town GetTown(int x, int y)
|
||||
{
|
||||
foreach (Town town in Towns)
|
||||
{
|
||||
|
||||
if (town.StartX <= x && town.EndX >= x && town.StartY <= y && town.EndY >= y)
|
||||
{
|
||||
return town;
|
||||
}
|
||||
}
|
||||
throw new KeyNotFoundException("x,y not in a town!");
|
||||
}
|
||||
|
||||
public static int[] GetDroppedItems(int x, int y)
|
||||
{
|
||||
return new int[] { }; // Not implemented yet.
|
||||
|
|
Loading…
Add table
Reference in a new issue