From 18c4459e6bfcc1f028b8a80831cafd27022d739b Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Mon, 21 Nov 2022 10:38:20 -0800 Subject: [PATCH] fix: Fixes region priority and resolution. (#1254) - [X] Fixes world location JSON deserializer. - [X] Fixes region resolver and priorities. - [X] Removes DynamicJson from regions. - [X] Adds missing region music. --- Distribution/Data/regions.json | 4889 ++++++++--------- .../Json/Converters/JsonDtoConverter.cs | 46 - .../Converters/JsonDtoConverterFactory.cs | 29 - .../Json/Converters/WorldLocationConverter.cs | 4 +- Projects/Server/Json/IJsonConvertible.cs | 28 - Projects/Server/Main.cs | 3 +- Projects/Server/Regions/Region.cs | 98 +- Projects/Server/Regions/RegionJsonDto.cs | 61 + .../Server/Regions/RegionJsonSerializer.cs | 148 + Projects/Server/Regions/RegionLoader.cs | 86 - Projects/UOContent/Commands/Handlers.cs | 2 +- Projects/UOContent/Engines/ConPVP/Arena.cs | 2 +- Projects/UOContent/Engines/ConPVP/SafeZone.cs | 2 +- Projects/UOContent/Mobiles/PlayerMobile.cs | 6 +- Projects/UOContent/Regions/BaseRegion.cs | 262 +- Projects/UOContent/Regions/DungeonRegion.cs | 52 +- .../UOContent/Regions/GreenAcresRegion.cs | 44 +- Projects/UOContent/Regions/GuardedRegion.cs | 603 +- Projects/UOContent/Regions/HouseRegion.cs | 671 ++- Projects/UOContent/Regions/JailRegion.cs | 145 +- .../Regions/JsonDtos/BaseRegionJsonDto.cs | 29 + .../Regions/JsonDtos/DungeonRegionJsonDto.cs | 26 + .../Regions/JsonDtos/GenericRegionJsonDto.cs | 34 + .../Regions/JsonDtos/GuardedRegionJsonDto.cs | 30 + .../Regions/JsonDtos/RegionJsonDtoExt.cs | 21 + Projects/UOContent/Regions/MondainRegion.cs | 33 +- .../UOContent/Regions/NewMaginciaRegion.cs | 17 +- Projects/UOContent/Regions/NoHousingRegion.cs | 24 +- .../Regions/NoTravelSpellsAllowedRegion.cs | 10 +- Projects/UOContent/Regions/TownRegion.cs | 16 +- .../Regions/TwistedWealdDesertRegion.cs | 65 +- 31 files changed, 3809 insertions(+), 3677 deletions(-) delete mode 100644 Projects/Server/Json/Converters/JsonDtoConverter.cs delete mode 100644 Projects/Server/Json/Converters/JsonDtoConverterFactory.cs delete mode 100644 Projects/Server/Json/IJsonConvertible.cs create mode 100644 Projects/Server/Regions/RegionJsonDto.cs create mode 100644 Projects/Server/Regions/RegionJsonSerializer.cs delete mode 100644 Projects/Server/Regions/RegionLoader.cs create mode 100644 Projects/UOContent/Regions/JsonDtos/BaseRegionJsonDto.cs create mode 100644 Projects/UOContent/Regions/JsonDtos/DungeonRegionJsonDto.cs create mode 100644 Projects/UOContent/Regions/JsonDtos/GenericRegionJsonDto.cs create mode 100644 Projects/UOContent/Regions/JsonDtos/GuardedRegionJsonDto.cs create mode 100644 Projects/UOContent/Regions/JsonDtos/RegionJsonDtoExt.cs diff --git a/Distribution/Data/regions.json b/Distribution/Data/regions.json index 15e2d6a99..0e0edb63f 100644 --- a/Distribution/Data/regions.json +++ b/Distribution/Data/regions.json @@ -1,10 +1,10 @@ [ { - "name": "Moongates", - "type": "GuardedRegion", - "map": "Felucca", - "priority": 50, - "rects": [ + "$type": "GuardedRegion", + "Name": "Moongates", + "Map": "Felucca", + "Priority": 50, + "Area": [ { "x1": 1330, "y1": 1991, "x2": 1343, "y2": 2004 }, { "x1": 1494, "y1": 3767, "x2": 1506, "y2": 3778 }, { "x1": 2694, "y1": 685, "x2": 2709, "y2": 701 }, @@ -16,116 +16,116 @@ ] }, { - "name": "Heartwood", - "type": "TownRegion", - "map": "Felucca", - "priority": 50, - "music": "ElfCity", - "rects": [{ "x1": 6911, "y1": 255, "x2": 7168, "y2": 512 }], - "go": { "x": 6984, "y": 337, "z": 0 }, - "entrance": { "x": 535, "y": 995 } + "$type": "TownRegion", + "Name": "Heartwood", + "Map": "Felucca", + "Priority": 50, + "Music": "ElfCity", + "Area": [{ "x1": 6911, "y1": 255, "x2": 7168, "y2": 512 }], + "GoLocation": { "x": 6984, "y": 337, "z": 0 }, + "Entrance": { "x": 535, "y": 995 } }, { - "name": "Sanctuary", - "type": "MondainRegion", - "map": "Felucca", - "priority": 50, - "music": "Dungeon9", - "rects": [{ "x1": 6157, "y1": 4, "x2": 6399, "y2": 255 }], - "go": { "x": 6173, "y": 23, "z": 0 }, - "entrance": { "x": 764, "y": 1646 } + "$type": "MondainRegion", + "Name": "Sanctuary", + "Map": "Felucca", + "Priority": 50, + "Music": "Dungeon9", + "Area": [{ "x1": 6157, "y1": 4, "x2": 6399, "y2": 255 }], + "GoLocation": { "x": 6173, "y": 23, "z": 0 }, + "Entrance": { "x": 764, "y": 1646 } }, { - "name": "Painted Caves", - "type": "MondainRegion", - "map": "Felucca", - "priority": 50, - "music": "Dungeon9", - "rects": [{ "x1": 6240, "y1": 860, "x2": 6310, "y2": 920 }], - "go": { "x": 6308, "y": 892, "z": -1 }, - "entrance": { "x": 1716, "y": 892 } + "$type": "MondainRegion", + "Name": "Painted Caves", + "Map": "Felucca", + "Priority": 50, + "Music": "Dungeon9", + "Area": [{ "x1": 6240, "y1": 860, "x2": 6310, "y2": 920 }], + "GoLocation": { "x": 6308, "y": 892, "z": -1 }, + "Entrance": { "x": 1716, "y": 892 } }, { - "name": "Prism of Light", - "type": "MondainRegion", - "map": "Felucca", - "priority": 50, - "music": "Dungeon9", - "rects": [{ "x1": 6400, "y1": 0, "x2": 6621, "y2": 255 }], - "go": { "x": 6474, "y": 188, "z": 0 }, - "entrance": { "x": 3784, "y": 1097 } + "$type": "MondainRegion", + "Name": "Prism of Light", + "Map": "Felucca", + "Priority": 50, + "Music": "Dungeon9", + "Area": [{ "x1": 6400, "y1": 0, "x2": 6621, "y2": 255 }], + "GoLocation": { "x": 6474, "y": 188, "z": 0 }, + "Entrance": { "x": 3784, "y": 1097 } }, { - "name": "Blighted Grove", - "type": "MondainRegion", - "map": "Felucca", - "priority": 50, - "music": "MelisandesLair", - "rects": [{ "x1": 6440, "y1": 820, "x2": 6600, "y2": 970 }], - "go": { "x": 6478, "y": 863, "z": 11 }, - "entrance": { "x": 587, "y": 1641 } + "$type": "MondainRegion", + "Name": "Blighted Grove", + "Map": "Felucca", + "Priority": 50, + "Music": "MelisandesLair", + "Area": [{ "x1": 6440, "y1": 820, "x2": 6600, "y2": 970 }], + "GoLocation": { "x": 6478, "y": 863, "z": 11 }, + "Entrance": { "x": 587, "y": 1641 } }, { - "name": "Palace of Paroxysmus", - "type": "MondainRegion", - "map": "Felucca", - "priority": 50, - "music": "ParoxysmusLair", - "rects": [{ "x1": 6191, "y1": 311, "x2": 6561, "y2": 671 }], - "go": { "x": 6222, "y": 335, "z": 60 }, - "entrance": { "x": 5574, "y": 3024 } + "$type": "MondainRegion", + "Name": "Palace of Paroxysmus", + "Map": "Felucca", + "Priority": 50, + "Music": "ParoxysmusLair", + "Area": [{ "x1": 6191, "y1": 311, "x2": 6561, "y2": 671 }], + "GoLocation": { "x": 6222, "y": 335, "z": 60 }, + "Entrance": { "x": 5574, "y": 3024 } }, { - "name": "Huntsman's Forest", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 1595, "y1": 550, "x2": 1715, "y2": 670 }] + "$type": "BaseRegion", + "Name": "Huntsman's Forest", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 1595, "y1": 550, "x2": 1715, "y2": 670 }] }, { - "name": "Cove", - "type": "TownRegion", - "map": "Felucca", - "priority": 50, - "music": "Cove", - "rects": [ + "$type": "TownRegion", + "Name": "Cove", + "Map": "Felucca", + "Priority": 50, + "Music": "Cove", + "Area": [ { "x1": 2200, "y1": 1110, "x2": 2250, "y2": 1160 }, { "x1": 2200, "y1": 1160, "x2": 2286, "y2": 1246 } ], - "go": { "x": 2275, "y": 1210, "z": 0 } + "GoLocation": { "x": 2275, "y": 1210, "z": 0 } }, { - "name": "Britain", - "type": "TownRegion", - "map": "Felucca", - "priority": 50, - "music": "Britain1", - "rects": [ + "$type": "TownRegion", + "Name": "Britain", + "Map": "Felucca", + "Priority": 50, + "Music": "Britain1", + "Area": [ { "x1": 1416, "y1": 1498, "z1": -10, "x2": 1740, "y2": 1777, "z2": 128 }, { "x1": 1385, "y1": 1538, "z1": -10, "x2": 1416, "y2": 1777, "z2": 128 }, { "x1": 1416, "y1": 1777, "z1": 0, "x2": 1740, "y2": 1837, "z2": 128 }, { "x1": 1385, "y1": 1777, "z1": 0, "x2": 1416, "y2": 1907, "z2": 128 }, { "x1": 1093, "y1": 1538, "z1": 0, "x2": 1385, "y2": 1907, "z2": 128 } ], - "go": { "x": 1495, "y": 1629, "z": 10 } + "GoLocation": { "x": 1495, "y": 1629, "z": 10 } }, { - "name": "Blackthorn Castle", - "type": "BaseRegion", - "map": "Felucca", - "parent": "Britain", - "priority": 50, - "music": "LBCastle", - "rects": [{ "x1": 1500, "y1": 1408, "x2": 1546, "y2": 1498 }], - "go": { "x": 1523, "y": 1443, "z": 15 }, - "entrance": { "x": 1523, "y": 1504 } + "$type": "BaseRegion", + "Name": "Blackthorn Castle", + "Map": "Felucca", + "Parent": "Britain", + "Priority": 50, + "Music": "LBCastle", + "Area": [{ "x1": 1500, "y1": 1408, "x2": 1546, "y2": 1498 }], + "GoLocation": { "x": 1523, "y": 1443, "z": 15 }, + "Entrance": { "x": 1523, "y": 1504 } }, { - "type": "BaseRegion", - "map": "Felucca", - "parent": "Britain", - "logoutDelay": false, - "rects": [ + "$type": "BaseRegion", + "Map": "Felucca", + "Parent": "Britain", + "LogoutDelay": false, + "Area": [ { "x1": 1492, "y1": 1602, "z1": 0, "x2": 1500, "y2": 1621, "z2": 128 }, { "x1": 1500, "y1": 1610, "z1": 0, "x2": 1508, "y2": 1626, "z2": 128 }, { "x1": 1576, "y1": 1584, "z1": 0, "x2": 1600, "y2": 1600, "z2": 128 }, @@ -142,133 +142,133 @@ ] }, { - "name": "A Wheatfield in Britain 1", - "type": "BaseRegion", - "map": "Felucca", - "parent": "Britain", - "rects": [{ "x1": 1120, "y1": 1776, "x2": 1152, "y2": 1808 }], - "go": { "x": 1135, "y": 1791, "z": 0 } + "$type": "BaseRegion", + "Name": "A Wheatfield in Britain 1", + "Map": "Felucca", + "Parent": "Britain", + "Area": [{ "x1": 1120, "y1": 1776, "x2": 1152, "y2": 1808 }], + "GoLocation": { "x": 1135, "y": 1791, "z": 0 } }, { - "name": "A Wheatfield in Britain 2", - "type": "BaseRegion", - "map": "Felucca", - "parent": "Britain", - "rects": [{ "x1": 1184, "y1": 1808, "x2": 1216, "y2": 1840 }], - "go": { "x": 1199, "y": 1823, "z": 0 } + "$type": "BaseRegion", + "Name": "A Wheatfield in Britain 2", + "Map": "Felucca", + "Parent": "Britain", + "Area": [{ "x1": 1184, "y1": 1808, "x2": 1216, "y2": 1840 }], + "GoLocation": { "x": 1199, "y": 1823, "z": 0 } }, { - "name": "A Wheatfield in Britain 3", - "type": "BaseRegion", - "map": "Felucca", - "parent": "Britain", - "rects": [{ "x1": 1216, "y1": 1872, "x2": 1248, "y2": 1904 }], - "go": { "x": 1231, "y": 1887, "z": 0 } + "$type": "BaseRegion", + "Name": "A Wheatfield in Britain 3", + "Map": "Felucca", + "Parent": "Britain", + "Area": [{ "x1": 1216, "y1": 1872, "x2": 1248, "y2": 1904 }], + "GoLocation": { "x": 1231, "y": 1887, "z": 0 } }, { - "name": "A Carrot Field in Britain 1", - "type": "BaseRegion", - "map": "Felucca", - "parent": "Britain", - "rects": [{ "x1": 1208, "y1": 1712, "x2": 1224, "y2": 1736 }], - "go": { "x": 1215, "y": 1723, "z": 0 } + "$type": "BaseRegion", + "Name": "A Carrot Field in Britain 1", + "Map": "Felucca", + "Parent": "Britain", + "Area": [{ "x1": 1208, "y1": 1712, "x2": 1224, "y2": 1736 }], + "GoLocation": { "x": 1215, "y": 1723, "z": 0 } }, { - "name": "An Onion Field in Britain 1", - "type": "BaseRegion", - "map": "Felucca", - "parent": "Britain", - "rects": [{ "x1": 1224, "y1": 1712, "x2": 1240, "y2": 1736 }], - "go": { "x": 1231, "y": 1723, "z": 0 } + "$type": "BaseRegion", + "Name": "An Onion Field in Britain 1", + "Map": "Felucca", + "Parent": "Britain", + "Area": [{ "x1": 1224, "y1": 1712, "x2": 1240, "y2": 1736 }], + "GoLocation": { "x": 1231, "y": 1723, "z": 0 } }, { - "name": "A Cabbage Field in Britain 1", - "type": "BaseRegion", - "map": "Felucca", - "parent": "Britain", - "rects": [{ "x1": 1176, "y1": 1672, "x2": 1192, "y2": 1695 }], - "go": { "x": 1183, "y": 1683, "z": 0 } + "$type": "BaseRegion", + "Name": "A Cabbage Field in Britain 1", + "Map": "Felucca", + "Parent": "Britain", + "Area": [{ "x1": 1176, "y1": 1672, "x2": 1192, "y2": 1695 }], + "GoLocation": { "x": 1183, "y": 1683, "z": 0 } }, { - "name": "A Turnip Field in Britain 1", - "type": "BaseRegion", - "map": "Felucca", - "parent": "Britain", - "rects": [{ "x1": 1192, "y1": 1672, "x2": 1208, "y2": 1696 }], - "go": { "x": 1199, "y": 1683, "z": 0 } + "$type": "BaseRegion", + "Name": "A Turnip Field in Britain 1", + "Map": "Felucca", + "Parent": "Britain", + "Area": [{ "x1": 1192, "y1": 1672, "x2": 1208, "y2": 1696 }], + "GoLocation": { "x": 1199, "y": 1683, "z": 0 } }, { - "name": "A Wheatfield in Britain 4", - "type": "BaseRegion", - "map": "Felucca", - "parent": "Britain", - "rects": [{ "x1": 1104, "y1": 1608, "x2": 1136, "y2": 1640 }], - "go": { "x": 1120, "y": 1624, "z": 0 } + "$type": "BaseRegion", + "Name": "A Wheatfield in Britain 4", + "Map": "Felucca", + "Parent": "Britain", + "Area": [{ "x1": 1104, "y1": 1608, "x2": 1136, "y2": 1640 }], + "GoLocation": { "x": 1120, "y": 1624, "z": 0 } }, { - "name": "A Wheatfield in Britain 5", - "type": "BaseRegion", - "map": "Felucca", - "parent": "Britain", - "rects": [{ "x1": 1136, "y1": 1560, "x2": 1168, "y2": 1592 }], - "go": { "x": 1152, "y": 1576, "z": 0 } + "$type": "BaseRegion", + "Name": "A Wheatfield in Britain 5", + "Map": "Felucca", + "Parent": "Britain", + "Area": [{ "x1": 1136, "y1": 1560, "x2": 1168, "y2": 1592 }], + "GoLocation": { "x": 1152, "y": 1576, "z": 0 } }, { - "name": "A Turnip Field in Britain 2", - "type": "BaseRegion", - "map": "Felucca", - "parent": "Britain", - "rects": [{ "x1": 1208, "y1": 1592, "x2": 1224, "y2": 1616 }], - "go": { "x": 1216, "y": 1604, "z": 0 } + "$type": "BaseRegion", + "Name": "A Turnip Field in Britain 2", + "Map": "Felucca", + "Parent": "Britain", + "Area": [{ "x1": 1208, "y1": 1592, "x2": 1224, "y2": 1616 }], + "GoLocation": { "x": 1216, "y": 1604, "z": 0 } }, { - "name": "A Carrot Field in Britain 2", - "type": "BaseRegion", - "map": "Felucca", - "parent": "Britain", - "rects": [{ "x1": 1224, "y1": 1592, "x2": 1240, "y2": 1616 }], - "go": { "x": 1232, "y": 1604, "z": 0 } + "$type": "BaseRegion", + "Name": "A Carrot Field in Britain 2", + "Map": "Felucca", + "Parent": "Britain", + "Area": [{ "x1": 1224, "y1": 1592, "x2": 1240, "y2": 1616 }], + "GoLocation": { "x": 1232, "y": 1604, "z": 0 } }, { - "name": "Britain Graveyard", - "type": "NoHousingRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 1333, "y1": 1441, "x2": 1417, "y2": 1523 }], - "go": { "x": 1384, "y": 1492, "z": 10 } + "$type": "NoHousingRegion", + "Name": "Britain Graveyard", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 1333, "y1": 1441, "x2": 1417, "y2": 1523 }], + "GoLocation": { "x": 1384, "y": 1492, "z": 10 } }, { - "name": "Jhelom Islands", - "type": "NoHousingRegion", - "map": "Felucca", - "priority": 50, - "music": "Jhelom", - "rects": [ + "$type": "NoHousingRegion", + "Name": "Jhelom Islands", + "Map": "Felucca", + "Priority": 50, + "Music": "Jhelom", + "Area": [ { "x1": 1111, "y1": 3567, "x2": 1144, "y2": 3588 }, { "x1": 1078, "y1": 3588, "x2": 1202, "y2": 3709 }, { "x1": 1224, "y1": 3592, "x2": 1533, "y2": 4065 } ], - "go": { "x": 1383, "y": 3815, "z": 0 } + "GoLocation": { "x": 1383, "y": 3815, "z": 0 } }, { - "name": "Jhelom", - "type": "TownRegion", - "map": "Felucca", - "parent": "Jhelom Islands", - "music": "Jhelom", - "rects": [ + "$type": "TownRegion", + "Name": "Jhelom", + "Map": "Felucca", + "Parent": "Jhelom Islands", + "Music": "Jhelom", + "Area": [ { "x1": 1303, "y1": 3670, "z1": -20, "x2": 1492, "y2": 3895, "z2": 128 }, { "x1": 1338, "y1": 3895, "z1": -20, "x2": 1412, "y2": 3923, "z2": 128 }, { "x1": 1383, "y1": 3951, "z1": -20, "x2": 1492, "y2": 4045, "z2": 128 } ], - "go": { "x": 1383, "y": 3815, "z": 0 } + "GoLocation": { "x": 1383, "y": 3815, "z": 0 } }, { - "type": "BaseRegion", - "map": "Felucca", - "parent": "Jhelom", - "logoutDelay": false, - "rects": [ + "$type": "BaseRegion", + "Map": "Felucca", + "Parent": "Jhelom", + "LogoutDelay": false, + "Area": [ { "x1": 1352, "y1": 3800, "z1": -20, "x2": 1368, "y2": 3832, "z2": 128 }, { "x1": 1368, "y1": 3808, "z1": -20, "x2": 1376, "y2": 3824, "z2": 128 }, { "x1": 1432, "y1": 3768, "z1": -20, "x2": 1464, "y2": 3776, "z2": 128 }, @@ -276,38 +276,38 @@ ] }, { - "name": "Minoc", - "type": "TownRegion", - "map": "Felucca", - "priority": 50, - "music": "Minoc", - "rects": [ + "$type": "TownRegion", + "Name": "Minoc", + "Map": "Felucca", + "Priority": 50, + "Music": "Minoc", + "Area": [ { "x1": 2411, "y1": 366, "x2": 2546, "y2": 607 }, { "x1": 2548, "y1": 495, "x2": 2620, "y2": 550 }, { "x1": 2564, "y1": 585, "x2": 2567, "y2": 627 }, { "x1": 2567, "y1": 585, "x2": 2628, "y2": 646 }, { "x1": 2499, "y1": 627, "x2": 2567, "y2": 690 } ], - "go": { "x": 2466, "y": 544, "z": 0 } + "GoLocation": { "x": 2466, "y": 544, "z": 0 } }, { - "type": "BaseRegion", - "map": "Felucca", - "parent": "Minoc", - "logoutDelay": false, - "rects": [ + "$type": "BaseRegion", + "Map": "Felucca", + "Parent": "Minoc", + "LogoutDelay": false, + "Area": [ { "x1": 2457, "y1": 397, "x2": 2497, "y2": 405 }, { "x1": 2465, "y1": 405, "x2": 2473, "y2": 413 }, { "x1": 2481, "y1": 405, "x2": 2489, "y2": 413 } ] }, { - "name": "Ocllo", - "type": "TownRegion", - "map": "Felucca", - "priority": 50, - "music": "Ocllo", - "rects": [ + "$type": "TownRegion", + "Name": "Ocllo", + "Map": "Felucca", + "Priority": 50, + "Music": "Ocllo", + "Area": [ { "x1": 3587, "y1": 2456, "x2": 3706, "y2": 2555 }, { "x1": 3706, "y1": 2460, "x2": 3708, "y2": 2555 }, { "x1": 3587, "y1": 2555, "x2": 3693, "y2": 2628 }, @@ -317,26 +317,26 @@ { "x1": 3761, "y1": 2555, "z1": -127, "x2": 3768, "y2": 2699, "z2": 50 }, { "x1": 3695, "y1": 2699, "x2": 3761, "y2": 2712 } ], - "go": { "x": 3650, "y": 2519, "z": 0 } + "GoLocation": { "x": 3650, "y": 2519, "z": 0 } }, { - "type": "BaseRegion", - "map": "Felucca", - "parent": "Ocllo", - "logoutDelay": false, - "rects": [ + "$type": "BaseRegion", + "Map": "Felucca", + "Parent": "Ocllo", + "LogoutDelay": false, + "Area": [ { "x1": 3664, "y1": 2608, "x2": 3680, "y2": 2624 }, { "x1": 3664, "y1": 2640, "x2": 3672, "y2": 2656 }, { "x1": 3672, "y1": 2648, "x2": 3680, "y2": 2656 } ] }, { - "name": "Trinsic", - "type": "TownRegion", - "map": "Felucca", - "priority": 50, - "music": "Trinsic", - "rects": [ + "$type": "TownRegion", + "Name": "Trinsic", + "Map": "Felucca", + "Priority": 50, + "Music": "Trinsic", + "Area": [ { "x1": 1856, "y1": 2636, "x2": 1931, "y2": 2664 }, { "x1": 1816, "y1": 2664, "x2": 2099, "y2": 2895 }, { "x1": 2099, "y1": 2782, "x2": 2117, "y2": 2807 }, @@ -344,14 +344,14 @@ { "x1": 1796, "y1": 2696, "z1": 0, "x2": 1816, "y2": 2763, "z2": 128 }, { "x1": 1800, "y1": 2796, "z1": 0, "x2": 1816, "y2": 2848, "z2": 128 } ], - "go": { "x": 1867, "y": 2780, "z": 0 } + "GoLocation": { "x": 1867, "y": 2780, "z": 0 } }, { - "type": "BaseRegion", - "map": "Felucca", - "parent": "Trinsic", - "logoutDelay": false, - "rects": [ + "$type": "BaseRegion", + "Map": "Felucca", + "Parent": "Trinsic", + "LogoutDelay": false, + "Area": [ { "x1": 1834, "y1": 2728, "x2": 1856, "y2": 2744 }, { "x1": 2024, "y1": 2784, "x2": 2040, "y2": 2804 }, { "x1": 2026, "y1": 2804, "x2": 2040, "y2": 2806 }, @@ -361,25 +361,25 @@ ] }, { - "name": "Vesper", - "type": "TownRegion", - "map": "Felucca", - "priority": 50, - "music": "Vesper", - "rects": [ + "$type": "TownRegion", + "Name": "Vesper", + "Map": "Felucca", + "Priority": 50, + "Music": "Vesper", + "Area": [ { "x1": 2893, "y1": 598, "x2": 3014, "y2": 648 }, { "x1": 2816, "y1": 648, "x2": 3065, "y2": 1013 }, { "x1": 2734, "y1": 944, "x2": 2816, "y2": 948 }, { "x1": 2728, "y1": 948, "x2": 2816, "y2": 1001 } ], - "go": { "x": 2899, "y": 676, "z": 0 } + "GoLocation": { "x": 2899, "y": 676, "z": 0 } }, { - "type": "BaseRegion", - "map": "Felucca", - "parent": "Vesper", - "logoutDelay": false, - "rects": [ + "$type": "BaseRegion", + "Map": "Felucca", + "Parent": "Vesper", + "LogoutDelay": false, + "Area": [ { "x1": 2952, "y1": 864, "x2": 2968, "y2": 896 }, { "x1": 2968, "y1": 872, "x2": 2976, "y2": 888 }, { "x1": 2776, "y1": 952, "x2": 2792, "y2": 984 }, @@ -389,12 +389,12 @@ ] }, { - "name": "Yew", - "type": "TownRegion", - "map": "Felucca", - "priority": 50, - "music": "Yew", - "rects": [ + "$type": "TownRegion", + "Name": "Yew", + "Map": "Felucca", + "Priority": 50, + "Music": "Yew", + "Area": [ { "x1": 92, "y1": 656, "z1": 0, "x2": 441, "y2": 881, "z2": 39 }, { "x1": 441, "y1": 746, "z1": 0, "x2": 657, "y2": 881, "z2": 39 }, { "x1": 258, "y1": 881, "z1": 0, "x2": 657, "y2": 1261, "z2": 39 }, @@ -402,67 +402,67 @@ { "x1": 657, "y1": 806, "z1": 0, "x2": 674, "y2": 834, "z2": 39 }, { "x1": 718, "y1": 874, "z1": 0, "x2": 756, "y2": 896, "z2": 39 } ], - "go": { "x": 546, "y": 992, "z": 0 } + "GoLocation": { "x": 546, "y": 992, "z": 0 } }, { - "type": "BaseRegion", - "map": "Felucca", - "parent": "Yew", - "logoutDelay": false, - "rects": [{ "x1": 600, "y1": 808, "z1": 0, "x2": 624, "y2": 832, "z2": 39 }] + "$type": "BaseRegion", + "Map": "Felucca", + "Parent": "Yew", + "LogoutDelay": false, + "Area": [{ "x1": 600, "y1": 808, "z1": 0, "x2": 624, "y2": 832, "z2": 39 }] }, { - "name": "A Field of Sheep in Yew 1", - "type": "BaseRegion", - "map": "Felucca", - "parent": "Yew", + "$type": "BaseRegion", + "Name": "A Field of Sheep in Yew 1", + "Map": "Felucca", + "Parent": "Yew", "rune": "A Field of Sheep in Yew", - "rects": [{ "x1": 664, "y1": 928, "x2": 686, "y2": 950 }], - "go": { "x": 675, "y": 939, "z": 0 } + "Area": [{ "x1": 664, "y1": 928, "x2": 686, "y2": 950 }], + "GoLocation": { "x": 675, "y": 939, "z": 0 } }, { - "name": "A Field of Sheep in Yew 2", - "type": "BaseRegion", - "map": "Felucca", - "parent": "Yew", + "$type": "BaseRegion", + "Name": "A Field of Sheep in Yew 2", + "Map": "Felucca", + "Parent": "Yew", "rune": "A Field of Sheep in Yew", - "rects": [{ "x1": 664, "y1": 1168, "x2": 686, "y2": 1190 }], - "go": { "x": 675, "y": 1179, "z": 0 } + "Area": [{ "x1": 664, "y1": 1168, "x2": 686, "y2": 1190 }], + "GoLocation": { "x": 675, "y": 1179, "z": 0 } }, { - "name": "A Farm in Yew", - "type": "BaseRegion", - "map": "Felucca", - "parent": "Yew", + "$type": "BaseRegion", + "Name": "A Farm in Yew", + "Map": "Felucca", + "Parent": "Yew", "rune": "A Farm in Yew", - "rects": [{ "x1": 560, "y1": 1088, "x2": 582, "y2": 1110 }], - "go": { "x": 571, "y": 1099, "z": 0 } + "Area": [{ "x1": 560, "y1": 1088, "x2": 582, "y2": 1110 }], + "GoLocation": { "x": 571, "y": 1099, "z": 0 } }, { - "name": "A Wheatfield in Yew 1", - "type": "BaseRegion", - "map": "Felucca", - "parent": "Yew", + "$type": "BaseRegion", + "Name": "A Wheatfield in Yew 1", + "Map": "Felucca", + "Parent": "Yew", "rune": "A Wheatfield in Yew", - "rects": [{ "x1": 560, "y1": 1232, "x2": 576, "y2": 1248 }], - "go": { "x": 567, "y": 1239, "z": 0 } + "Area": [{ "x1": 560, "y1": 1232, "x2": 576, "y2": 1248 }], + "GoLocation": { "x": 567, "y": 1239, "z": 0 } }, { - "name": "A Wheatfield in Yew 2", - "type": "BaseRegion", - "map": "Felucca", - "parent": "Yew", + "$type": "BaseRegion", + "Name": "A Wheatfield in Yew 2", + "Map": "Felucca", + "Parent": "Yew", "rune": "A Wheatfield in Yew", - "rects": [{ "x1": 368, "y1": 1176, "x2": 382, "y2": 1208 }], - "go": { "x": 375, "y": 1191, "z": 0 } + "Area": [{ "x1": 368, "y1": 1176, "x2": 382, "y2": 1208 }], + "GoLocation": { "x": 375, "y": 1191, "z": 0 } }, { - "name": "Wind", - "type": "TownRegion", - "map": "Felucca", - "priority": 50, - "music": "Wind", - "rects": [ + "$type": "TownRegion", + "Name": "Wind", + "Map": "Felucca", + "Priority": 50, + "Music": "Wind", + "Area": [ { "x1": 5294, "y1": 19, "x2": 5366, "y2": 139 }, { "x1": 5132, "y1": 58, "x2": 5213, "y2": 126 }, { "x1": 5197, "y1": 126, "x2": 5252, "y2": 204 }, @@ -475,14 +475,14 @@ { "x1": 5252, "y1": 178, "x2": 5272, "y2": 183 }, { "x1": 5252, "y1": 183, "x2": 5262, "y2": 193 } ], - "go": { "x": 5223, "y": 190, "z": 5 } + "GoLocation": { "x": 5223, "y": 190, "z": 5 } }, { - "type": "BaseRegion", - "map": "Felucca", - "parent": "Wind", - "logoutDelay": false, - "rects": [ + "$type": "BaseRegion", + "Map": "Felucca", + "Parent": "Wind", + "LogoutDelay": false, + "Area": [ { "x1": 5159, "y1": 15, "x2": 5184, "y2": 24 }, { "x1": 5159, "y1": 24, "x2": 5168, "y2": 40 }, { "x1": 5175, "y1": 24, "x2": 5184, "y2": 32 }, @@ -493,40 +493,40 @@ ] }, { - "name": "Serpent's Hold", - "type": "TownRegion", - "map": "Felucca", - "priority": 50, - "music": "Serpents", - "rects": [{ "x1": 2868, "y1": 3324, "z1": 0, "x2": 3073, "y2": 3519, "z2": 128 }], - "go": { "x": 3010, "y": 3371, "z": 15 } + "$type": "TownRegion", + "Name": "Serpent's Hold", + "Map": "Felucca", + "Priority": 50, + "Music": "Serpents", + "Area": [{ "x1": 2868, "y1": 3324, "z1": 0, "x2": 3073, "y2": 3519, "z2": 128 }], + "GoLocation": { "x": 3010, "y": 3371, "z": 15 } }, { - "type": "BaseRegion", - "map": "Felucca", - "parent": "Serpent's Hold", - "logoutDelay": false, - "rects": [ + "$type": "BaseRegion", + "Map": "Felucca", + "Parent": "Serpent's Hold", + "LogoutDelay": false, + "Area": [ { "x1": 2960, "y1": 3400, "z1": 0, "x2": 2976, "y2": 3416, "z2": 128 }, { "x1": 2968, "y1": 3416, "z1": 0, "x2": 2976, "y2": 3432, "z2": 128 }, { "x1": 3008, "y1": 3450, "z1": 0, "x2": 3022, "y2": 3464, "z2": 128 } ] }, { - "name": "Skara Brae", - "type": "TownRegion", - "map": "Felucca", - "priority": 50, - "music": "Skarabra", - "rects": [{ "x1": 538, "y1": 2107, "x2": 688, "y2": 2297 }], - "go": { "x": 632, "y": 2233, "z": 0 } + "$type": "TownRegion", + "Name": "Skara Brae", + "Map": "Felucca", + "Priority": 50, + "Music": "Skarabra", + "Area": [{ "x1": 538, "y1": 2107, "x2": 688, "y2": 2297 }], + "GoLocation": { "x": 632, "y": 2233, "z": 0 } }, { - "type": "BaseRegion", - "map": "Felucca", - "parent": "Skara Brae", - "logoutDelay": false, - "rects": [ + "$type": "BaseRegion", + "Map": "Felucca", + "Parent": "Skara Brae", + "LogoutDelay": false, + "Area": [ { "x1": 600, "y1": 2232, "x2": 616, "y2": 2256 }, { "x1": 592, "y1": 2240, "x2": 600, "y2": 2256 }, { "x1": 616, "y1": 2240, "x2": 624, "y2": 2256 }, @@ -535,20 +535,20 @@ ] }, { - "name": "Nujel'm", - "type": "TownRegion", - "map": "Felucca", - "priority": 50, - "music": "Nujelm", - "rects": [{ "x1": 3475, "y1": 1000, "z1": 0, "x2": 3835, "y2": 1435, "z2": 128 }], - "go": { "x": 3732, "y": 1279, "z": 0 } + "$type": "TownRegion", + "Name": "Nujel'm", + "Map": "Felucca", + "Priority": 50, + "Music": "Nujelm", + "Area": [{ "x1": 3475, "y1": 1000, "z1": 0, "x2": 3835, "y2": 1435, "z2": 128 }], + "GoLocation": { "x": 3732, "y": 1279, "z": 0 } }, { - "type": "BaseRegion", - "map": "Felucca", - "parent": "Nujel'm", - "logoutDelay": false, - "rects": [ + "$type": "BaseRegion", + "Map": "Felucca", + "Parent": "Nujel'm", + "LogoutDelay": false, + "Area": [ { "x1": 3736, "y1": 1184, "z1": 0, "x2": 3752, "y2": 1207, "z2": 128 }, { "x1": 3728, "y1": 1192, "z1": 0, "x2": 3736, "y2": 1207, "z2": 128 }, { "x1": 3728, "y1": 1288, "z1": 0, "x2": 3751, "y2": 1303, "z2": 128 }, @@ -565,12 +565,12 @@ ] }, { - "name": "Moonglow", - "type": "TownRegion", - "map": "Felucca", - "priority": 50, - "music": "Moonglow", - "rects": [ + "$type": "TownRegion", + "Name": "Moonglow", + "Map": "Felucca", + "Priority": 50, + "Music": "Moonglow", + "Area": [ { "x1": 4535, "y1": 844, "z1": 0, "x2": 4555, "y2": 847, "z2": 128 }, { "x1": 4530, "y1": 847, "z1": 0, "x2": 4561, "y2": 908, "z2": 128 }, { "x1": 4521, "y1": 914, "z1": 0, "x2": 4577, "y2": 963, "z2": 128 }, @@ -596,14 +596,14 @@ { "x1": 4405, "y1": 1451, "z1": 0, "x2": 4428, "y2": 1474, "z2": 128 }, { "x1": 4483, "y1": 1468, "z1": 0, "x2": 4504, "y2": 1481, "z2": 128 } ], - "go": { "x": 4442, "y": 1172, "z": 0 } + "GoLocation": { "x": 4442, "y": 1172, "z": 0 } }, { - "type": "BaseRegion", - "map": "Felucca", - "parent": "Moonglow", - "logoutDelay": false, - "rects": [ + "$type": "BaseRegion", + "Map": "Felucca", + "Parent": "Moonglow", + "LogoutDelay": false, + "Area": [ { "x1": 4384, "y1": 1152, "z1": 0, "x2": 4392, "y2": 1176, "z2": 128 }, { "x1": 4392, "y1": 1160, "z1": 0, "x2": 4408, "y2": 1168, "z2": 128 }, { "x1": 4400, "y1": 1152, "z1": 0, "x2": 4408, "y2": 1160, "z2": 128 }, @@ -613,12 +613,12 @@ ] }, { - "name": "Magincia", - "type": "NewMaginciaRegion", - "map": "Felucca", - "priority": 50, - "music": "Magincia", - "rects": [ + "$type": "NewMaginciaRegion", + "Name": "Magincia", + "Map": "Felucca", + "Priority": 50, + "Music": "Magincia", + "Area": [ { "x1": 3632, "y1": 2032, "x2": 3682, "y2": 2102 }, { "x1": 3624, "y1": 2162, "x2": 3719, "y2": 2232 }, { "x1": 3752, "y1": 2046, "x2": 3804, "y2": 2094 }, @@ -626,34 +626,34 @@ { "x1": 3652, "y1": 2094, "x2": 3812, "y2": 2274 }, { "x1": 3649, "y1": 2256, "x2": 3703, "y2": 2303 } ], - "go": { "x": 3714, "y": 2220, "z": 20 } + "GoLocation": { "x": 3714, "y": 2220, "z": 20 } }, { - "type": "BaseRegion", - "map": "Felucca", - "parent": "Magincia", - "logoutDelay": false, - "rects": [{ "x1": 3687, "y1": 2246, "x2": 3699, "y2": 2262 }] + "$type": "BaseRegion", + "Map": "Felucca", + "Parent": "Magincia", + "LogoutDelay": false, + "Area": [{ "x1": 3687, "y1": 2246, "x2": 3699, "y2": 2262 }] }, { - "name": "Buccaneer's Den", - "type": "TownRegion", - "map": "Felucca", - "priority": 50, - "music": "Bucsden", - "guardsDisabled": true, - "rects": [ + "$type": "TownRegion", + "Name": "Buccaneer's Den", + "Map": "Felucca", + "Priority": 50, + "Music": "Bucsden", + "GuardsDisabled": true, + "Area": [ { "x1": 2612, "y1": 2057, "x2": 2776, "y2": 2267 }, { "x1": 2604, "y1": 2065, "z1": 0, "x2": 2612, "y2": 2254, "z2": 128 } ], - "go": { "x": 2706, "y": 2163, "z": 0 } + "GoLocation": { "x": 2706, "y": 2163, "z": 0 } }, { - "type": "BaseRegion", - "map": "Felucca", - "parent": "Buccaneer's Den", - "logoutDelay": false, - "rects": [ + "$type": "BaseRegion", + "Map": "Felucca", + "Parent": "Buccaneer's Den", + "LogoutDelay": false, + "Area": [ { "x1": 2712, "y1": 2080, "x2": 2728, "y2": 2096 }, { "x1": 2712, "y1": 2096, "x2": 2720, "y2": 2104 }, { "x1": 2664, "y1": 2232, "x2": 2688, "y2": 2240 }, @@ -661,609 +661,610 @@ ] }, { - "name": "Covetous", - "type": "DungeonRegion", - "map": "Felucca", - "priority": 50, - "music": "Dungeon9", - "rects": [ + "$type": "DungeonRegion", + "Name": "Covetous", + "Map": "Felucca", + "Priority": 50, + "Music": "Dungeon9", + "Area": [ { "x1": 5376, "y1": 1793, "x2": 5577, "y2": 2048 }, { "x1": 5576, "y1": 1791, "x2": 5633, "y2": 2048 } ], - "go": { "x": 5456, "y": 1862, "z": 0 }, - "entrance": { "x": 2499, "y": 916 } + "GoLocation": { "x": 5456, "y": 1862, "z": 0 }, + "Entrance": { "x": 2499, "y": 916 } }, { - "name": "Deceit", - "type": "DungeonRegion", - "map": "Felucca", - "priority": 50, - "music": "Dungeon9", - "rects": [{ "x1": 5122, "y1": 518, "x2": 5370, "y2": 770 }], - "go": { "x": 5187, "y": 635, "z": 0 }, - "entrance": { "x": 4111, "y": 429 } + "$type": "DungeonRegion", + "Name": "Deceit", + "Map": "Felucca", + "Priority": 50, + "Music": "Dungeon9", + "Area": [{ "x1": 5122, "y1": 518, "x2": 5370, "y2": 770 }], + "GoLocation": { "x": 5187, "y": 635, "z": 0 }, + "Entrance": { "x": 4111, "y": 429 } }, { - "name": "Despise", - "type": "DungeonRegion", - "map": "Felucca", - "priority": 50, - "music": "Dungeon9", - "rects": [{ "x1": 5377, "y1": 516, "x2": 5631, "y2": 1022 }], - "go": { "x": 5501, "y": 570, "z": 59 }, - "entrance": { "x": 1296, "y": 1082 } + "$type": "DungeonRegion", + "Name": "Despise", + "Map": "Felucca", + "Priority": 50, + "Music": "Dungeon9", + "Area": [{ "x1": 5377, "y1": 516, "x2": 5631, "y2": 1022 }], + "GoLocation": { "x": 5501, "y": 570, "z": 59 }, + "Entrance": { "x": 1296, "y": 1082 } }, { - "name": "Destard", - "type": "DungeonRegion", - "map": "Felucca", - "priority": 50, - "music": "Dungeon9", - "rects": [{ "x1": 5120, "y1": 770, "x2": 5371, "y2": 1028 }], - "go": { "x": 5243, "y": 1004, "z": 0 }, - "entrance": { "x": 1176, "y": 2635 } + "$type": "DungeonRegion", + "Name": "Destard", + "Map": "Felucca", + "Priority": 50, + "Music": "Dungeon9", + "Area": [{ "x1": 5120, "y1": 770, "x2": 5371, "y2": 1028 }], + "GoLocation": { "x": 5243, "y": 1004, "z": 0 }, + "Entrance": { "x": 1176, "y": 2635 } }, { - "name": "Hythloth", - "type": "DungeonRegion", - "map": "Felucca", - "priority": 50, - "music": "Dungeon9", - "rects": [{ "x1": 5898, "y1": 2, "x2": 6136, "y2": 246 }], - "go": { "x": 5905, "y": 22, "z": 44 }, - "entrance": { "x": 4722, "y": 3814 } + "$type": "DungeonRegion", + "Name": "Hythloth", + "Map": "Felucca", + "Priority": 50, + "Music": "Dungeon9", + "Area": [{ "x1": 5898, "y1": 2, "x2": 6136, "y2": 246 }], + "GoLocation": { "x": 5905, "y": 22, "z": 44 }, + "Entrance": { "x": 4722, "y": 3814 } }, { - "name": "Khaldun", - "type": "DungeonRegion", - "map": "Felucca", - "priority": 50, - "music": "Dungeon9", - "rects": [{ "x1": 5381, "y1": 1284, "x2": 5628, "y2": 1509 }], - "go": { "x": 5571, "y": 1302, "z": 0 }, - "entrance": { "x": 5882, "y": 3819 } + "$type": "DungeonRegion", + "Name": "Khaldun", + "Map": "Felucca", + "Priority": 50, + "Music": "Dungeon9", + "Area": [{ "x1": 5381, "y1": 1284, "x2": 5628, "y2": 1509 }], + "GoLocation": { "x": 5571, "y": 1302, "z": 0 }, + "Entrance": { "x": 5882, "y": 3819 } }, { - "name": "Jail", - "type": "JailRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 5271, "y1": 1159, "x2": 5312, "y2": 1192 }], - "go": { "x": 5275, "y": 1163, "z": 0 } + "$type": "JailRegion", + "Name": "Jail", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 5271, "y1": 1159, "x2": 5312, "y2": 1192 }], + "GoLocation": { "x": 5275, "y": 1163, "z": 0 } }, { - "name": "Green Acres", - "type": "GreenAcresRegion", - "map": "Felucca", - "priority": 1, - "rects": [{ "x1": 5376, "y1": 512, "x2": 6143, "y2": 1279 }], - "go": { "x": 5445, "y": 1153, "z": 0 } + "$type": "GreenAcresRegion", + "Name": "Green Acres", + "Map": "Felucca", + "Priority": 1, + "Area": [{ "x1": 5376, "y1": 512, "x2": 6143, "y2": 1279 }], + "GoLocation": { "x": 5445, "y": 1153, "z": 0 } }, { - "name": "Shame", - "type": "DungeonRegion", - "map": "Felucca", - "priority": 50, - "music": "Dungeon9", - "rects": [ + "$type": "DungeonRegion", + "Name": "Shame", + "Map": "Felucca", + "Priority": 50, + "Music": "Dungeon9", + "Area": [ { "x1": 5377, "y1": 2, "x2": 5634, "y2": 262 }, { "x1": 5635, "y1": 2, "x2": 5895, "y2": 126 } ], - "go": { "x": 5395, "y": 126, "z": 0 }, - "entrance": { "x": 512, "y": 1559 } + "GoLocation": { "x": 5395, "y": 126, "z": 0 }, + "Entrance": { "x": 512, "y": 1559 } }, { - "name": "Wrong", - "type": "DungeonRegion", - "map": "Felucca", - "priority": 50, - "music": "Dungeon9", - "rects": [{ "x1": 5633, "y1": 511, "x2": 5886, "y2": 1021 }], - "go": { "x": 5825, "y": 599, "z": 0 }, - "entrance": { "x": 2042, "y": 226 } + "$type": "DungeonRegion", + "Name": "Wrong", + "Map": "Felucca", + "Priority": 50, + "Music": "Dungeon9", + "Area": [{ "x1": 5633, "y1": 511, "x2": 5886, "y2": 1021 }], + "GoLocation": { "x": 5825, "y": 599, "z": 0 }, + "Entrance": { "x": 2042, "y": 226 } }, { - "name": "Cave 1", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [ + "$type": "BaseRegion", + "Name": "Cave 1", + "Map": "Felucca", + "Priority": 50, + "Area": [ { "x1": 2373, "y1": 900, "x2": 2395, "y2": 928 }, { "x1": 2395, "y1": 903, "x2": 2409, "y2": 919 }, { "x1": 2373, "y1": 928, "x2": 2383, "y2": 937 }, { "x1": 2359, "y1": 927, "x2": 2373, "y2": 945 } ], - "go": { "x": 2367, "y": 942, "z": 0 } + "GoLocation": { "x": 2367, "y": 942, "z": 0 } }, { - "name": "Cave 2", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 1887, "y1": 354, "x2": 1920, "y2": 377 }], - "go": { "x": 1903, "y": 365, "z": 0 } + "$type": "BaseRegion", + "Name": "Cave 2", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 1887, "y1": 354, "x2": 1920, "y2": 377 }], + "GoLocation": { "x": 1903, "y": 365, "z": 0 } }, { - "name": "Cave 3", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 1925, "y1": 307, "x2": 1943, "y2": 325 }], - "go": { "x": 1934, "y": 316, "z": 0 } + "$type": "BaseRegion", + "Name": "Cave 3", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 1925, "y1": 307, "x2": 1943, "y2": 325 }], + "GoLocation": { "x": 1934, "y": 316, "z": 0 } }, { - "name": "Cave 4", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 2323, "y1": 809, "x2": 2368, "y2": 851 }], - "go": { "x": 2345, "y": 830, "z": 0 } + "$type": "BaseRegion", + "Name": "Cave 4", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 2323, "y1": 809, "x2": 2368, "y2": 851 }], + "GoLocation": { "x": 2345, "y": 830, "z": 0 } }, { - "name": "Britain Mine 1", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 1436, "y1": 1215, "x2": 1465, "y2": 1252 }], - "go": { "x": 1443, "y": 1228, "z": 0 } + "$type": "BaseRegion", + "Name": "Britain Mine 1", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 1436, "y1": 1215, "x2": 1465, "y2": 1252 }], + "GoLocation": { "x": 1443, "y": 1228, "z": 0 } }, { - "name": "Britain Mine 2", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 1611, "y1": 1175, "x2": 1662, "y2": 1204 }], - "go": { "x": 1629, "y": 1189, "z": 0 } + "$type": "BaseRegion", + "Name": "Britain Mine 2", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 1611, "y1": 1175, "x2": 1662, "y2": 1204 }], + "GoLocation": { "x": 1629, "y": 1189, "z": 0 } }, { - "name": "Minoc Cave 1", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 2406, "y1": 168, "x2": 2428, "y2": 184 }], - "go": { "x": 2426, "y": 177, "z": 0 } + "$type": "BaseRegion", + "Name": "Minoc Cave 1", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 2406, "y1": 168, "x2": 2428, "y2": 184 }], + "GoLocation": { "x": 2426, "y": 177, "z": 0 } }, { - "name": "Minoc Cave 2", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 2418, "y1": 81, "x2": 2442, "y2": 113 }], - "go": { "x": 2440, "y": 94, "z": 0 } + "$type": "BaseRegion", + "Name": "Minoc Cave 2", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 2418, "y1": 81, "x2": 2442, "y2": 113 }], + "GoLocation": { "x": 2440, "y": 94, "z": 0 } }, { - "name": "Minoc Cave 3", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 2447, "y1": 39, "x2": 2489, "y2": 67 }], - "go": { "x": 2471, "y": 64, "z": 0 } + "$type": "BaseRegion", + "Name": "Minoc Cave 3", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 2447, "y1": 39, "x2": 2489, "y2": 67 }], + "GoLocation": { "x": 2471, "y": 64, "z": 0 } }, { - "name": "Minoc Mine", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [ + "$type": "BaseRegion", + "Name": "Minoc Mine", + "Map": "Felucca", + "Priority": 50, + "Area": [ { "x1": 2556, "y1": 501, "x2": 2562, "y2": 504 }, { "x1": 2556, "y1": 474, "x2": 2582, "y2": 501 } ], - "go": { "x": 2558, "y": 499, "z": 0 } + "GoLocation": { "x": 2558, "y": 499, "z": 0 } }, { - "name": "Avatar Isle Cave", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 4594, "y1": 3807, "x2": 4617, "y2": 3824 }], - "go": { "x": 4605, "y": 3815, "z": 0 } + "$type": "BaseRegion", + "Name": "Avatar Isle Cave", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 4594, "y1": 3807, "x2": 4617, "y2": 3824 }], + "GoLocation": { "x": 4605, "y": 3815, "z": 0 } }, { - "name": "Ice Isle Cave 1", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 4018, "y1": 421, "x2": 4067, "y2": 470 }], - "go": { "x": 4054, "y": 440, "z": 3 } + "$type": "BaseRegion", + "Name": "Ice Isle Cave 1", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 4018, "y1": 421, "x2": 4067, "y2": 470 }], + "GoLocation": { "x": 4054, "y": 440, "z": 3 } }, { - "name": "Ice Isle Cave 2", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [ + "$type": "BaseRegion", + "Name": "Ice Isle Cave 2", + "Map": "Felucca", + "Priority": 50, + "Area": [ { "x1": 4002, "y1": 310, "x2": 4045, "y2": 351 }, { "x1": 4005, "y1": 298, "x2": 4027, "y2": 310 } ], - "go": { "x": 4030, "y": 325, "z": 0 } + "GoLocation": { "x": 4030, "y": 325, "z": 0 } }, { - "name": "North Territory Cave", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 1973, "y1": 251, "x2": 1994, "y2": 274 }], - "go": { "x": 1984, "y": 262, "z": 8 } + "$type": "BaseRegion", + "Name": "North Territory Cave", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 1973, "y1": 251, "x2": 1994, "y2": 274 }], + "GoLocation": { "x": 1984, "y": 262, "z": 8 } }, { - "name": "Yew Cave", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 766, "y1": 1683, "x2": 778, "y2": 1697 }], - "go": { "x": 773, "y": 1684, "z": 0 } + "$type": "BaseRegion", + "Name": "Yew Cave", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 766, "y1": 1683, "x2": 778, "y2": 1697 }], + "GoLocation": { "x": 773, "y": 1684, "z": 0 } }, { - "name": "North Territory Mine 1", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 1713, "y1": 1055, "x2": 1753, "y2": 1080 }], - "go": { "x": 1723, "y": 1065, "z": 0 } + "$type": "BaseRegion", + "Name": "North Territory Mine 1", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 1713, "y1": 1055, "x2": 1753, "y2": 1080 }], + "GoLocation": { "x": 1723, "y": 1065, "z": 0 } }, { - "name": "North Territory Mine 2", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 1604, "y1": 958, "x2": 1650, "y2": 1009 }], - "go": { "x": 1638, "y": 974, "z": 0 } + "$type": "BaseRegion", + "Name": "North Territory Mine 2", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 1604, "y1": 958, "x2": 1650, "y2": 1009 }], + "GoLocation": { "x": 1638, "y": 974, "z": 0 } }, { - "name": "Mt Kendall", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [ + "$type": "BaseRegion", + "Name": "Mt Kendall", + "Map": "Felucca", + "Priority": 50, + "Area": [ { "x1": 2552, "y1": 448, "x2": 2623, "y2": 507 }, { "x1": 2547, "y1": 380, "x2": 2590, "y2": 448 }, { "x1": 2590, "y1": 413, "x2": 2623, "y2": 448 } ], - "go": { "x": 2593, "y": 477, "z": 60 } + "GoLocation": { "x": 2593, "y": 477, "z": 60 } }, { - "name": "Covetous Mine", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [ + "$type": "BaseRegion", + "Name": "Covetous Mine", + "Map": "Felucca", + "Priority": 50, + "Area": [ { "x1": 2429, "y1": 866, "x2": 2448, "y2": 911 }, { "x1": 2448, "y1": 879, "x2": 2475, "y2": 907 }, { "x1": 2456, "y1": 907, "x2": 2475, "y2": 941 } ], - "go": { "x": 2445, "y": 880, "z": 0 } + "GoLocation": { "x": 2445, "y": 880, "z": 0 } }, { - "name": "Terathan Keep", - "type": "DungeonRegion", - "map": "Felucca", - "priority": 50, - "music": "Dungeon9", - "rects": [ + "$type": "DungeonRegion", + "Name": "Terathan Keep", + "Map": "Felucca", + "Priority": 50, + "Music": "Dungeon9", + "Area": [ { "x1": 5404, "y1": 3099, "x2": 5481, "y2": 3167 }, { "x1": 5120, "y1": 1530, "x2": 5374, "y2": 1788 } ], - "go": { "x": 5451, "y": 3143, "z": -60 }, - "entrance": { "x": 5426, "y": 3120 } + "GoLocation": { "x": 5451, "y": 3143, "z": -60 }, + "Entrance": { "x": 5426, "y": 3120 } }, { - "name": "Fire", - "type": "DungeonRegion", - "map": "Felucca", - "priority": 50, - "music": "Dungeon9", - "rects": [{ "x1": 5635, "y1": 1285, "x2": 5880, "y2": 1520 }], - "go": { "x": 5760, "y": 2908, "z": 15 }, - "entrance": { "x": 2922, "y": 3402 } + "$type": "DungeonRegion", + "Name": "Fire", + "Map": "Felucca", + "Priority": 50, + "Music": "Dungeon9", + "Area": [{ "x1": 5635, "y1": 1285, "x2": 5880, "y2": 1520 }], + "GoLocation": { "x": 5760, "y": 2908, "z": 15 }, + "Entrance": { "x": 2922, "y": 3402 } }, { - "name": "Ice", - "type": "DungeonRegion", - "map": "Felucca", - "priority": 50, - "music": "Dungeon9", - "rects": [ + "$type": "DungeonRegion", + "Name": "Ice", + "Map": "Felucca", + "Priority": 50, + "Music": "Dungeon9", + "Area": [ { "x1": 5668, "y1": 130, "x2": 5888, "y2": 268 }, { "x1": 5800, "y1": 319, "x2": 5863, "y2": 384 }, { "x1": 5654, "y1": 300, "x2": 5708, "y2": 340 } ], - "go": { "x": 5210, "y": 2322, "z": 30 }, - "entrance": { "x": 1996, "y": 80 } + "GoLocation": { "x": 5210, "y": 2322, "z": 30 }, + "Entrance": { "x": 1996, "y": 80 } }, { - "name": "Delucia", - "type": "TownRegion", - "map": "Felucca", - "priority": 50, - "rects": [ + "$type": "TownRegion", + "Name": "Delucia", + "Map": "Felucca", + "Priority": 50, + "Area": [ { "x1": 5123, "y1": 3942, "x2": 5315, "y2": 4064 }, { "x1": 5147, "y1": 4064, "x2": 5272, "y2": 4084 }, { "x1": 5235, "y1": 3930, "x2": 5315, "y2": 3942 } ], - "go": { "x": 5228, "y": 3978, "z": 37 } + "GoLocation": { "x": 5228, "y": 3978, "z": 37 } }, { - "type": "BaseRegion", - "map": "Felucca", - "parent": "Delucia", - "logoutDelay": false, - "rects": [{ "x1": 5194, "y1": 4053, "x2": 5204, "y2": 4073 }] + "$type": "BaseRegion", + "Name": "The Barely Inn", + "Map": "Felucca", + "Parent": "Delucia", + "LogoutDelay": false, + "Area": [{ "x1": 5194, "y1": 4053, "x2": 5204, "y2": 4073 }] }, { - "name": "Papua", - "type": "TownRegion", - "map": "Felucca", - "priority": 50, - "rects": [ + "$type": "TownRegion", + "Name": "Papua", + "Map": "Felucca", + "Priority": 50, + "Area": [ { "x1": 5639, "y1": 3095, "x2": 5831, "y2": 3318 }, { "x1": 5831, "y1": 3237, "x2": 5851, "y2": 3267 } ], - "go": { "x": 5769, "y": 3176, "z": 0 } + "GoLocation": { "x": 5769, "y": 3176, "z": 0 } }, { - "type": "BaseRegion", - "map": "Felucca", - "parent": "Papua", - "logoutDelay": false, - "rects": [{ "x1": 5757, "y1": 3150, "x2": 5781, "y2": 3174 }] + "$type": "BaseRegion", + "Map": "Felucca", + "Parent": "Papua", + "LogoutDelay": false, + "Area": [{ "x1": 5757, "y1": 3150, "x2": 5781, "y2": 3174 }] }, { - "name": "Wrong Entrance", - "type": "NoHousingRegion", - "map": "Felucca", - "priority": 50, - "music": "Mountn_a", - "rects": [{ "x1": 1939, "y1": 215, "x2": 2073, "y2": 352 }], - "go": { "x": 2043, "y": 236, "z": 13 } + "$type": "NoHousingRegion", + "Name": "Wrong Entrance", + "Map": "Felucca", + "Priority": 50, + "Music": "Mountn_a", + "Area": [{ "x1": 1939, "y1": 215, "x2": 2073, "y2": 352 }], + "GoLocation": { "x": 2043, "y": 236, "z": 13 } }, { - "name": "Covetous Entrance", - "type": "NoHousingRegion", - "map": "Felucca", - "priority": 50, - "music": "Vesper", - "rects": [{ "x1": 2433, "y1": 846, "x2": 2561, "y2": 974 }], - "go": { "x": 2499, "y": 918, "z": 0 } + "$type": "NoHousingRegion", + "Name": "Covetous Entrance", + "Map": "Felucca", + "Priority": 50, + "Music": "Vesper", + "Area": [{ "x1": 2433, "y1": 846, "x2": 2561, "y2": 974 }], + "GoLocation": { "x": 2499, "y": 918, "z": 0 } }, { - "name": "Despise Entrance", - "type": "NoHousingRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 1289, "y1": 1064, "x2": 1321, "y2": 1101 }], - "go": { "x": 1298, "y": 1081, "z": 0 } + "$type": "NoHousingRegion", + "Name": "Despise Entrance", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 1289, "y1": 1064, "x2": 1321, "y2": 1101 }], + "GoLocation": { "x": 1298, "y": 1081, "z": 0 } }, { - "name": "Despise Passage", - "type": "NoHousingRegion", - "map": "Felucca", - "priority": 50, - "rects": [ + "$type": "NoHousingRegion", + "Name": "Despise Passage", + "Map": "Felucca", + "Priority": 50, + "Area": [ { "x1": 1338, "y1": 1060, "x2": 1389, "y2": 1122 }, { "x1": 1354, "y1": 1122, "x2": 1396, "y2": 1243 }, { "x1": 1349, "y1": 1122, "x2": 1354, "y2": 1224 } ], - "go": { "x": 1380, "y": 1114, "z": 0 } + "GoLocation": { "x": 1380, "y": 1114, "z": 0 } }, { - "name": "Misc Dungeons", - "type": "DungeonRegion", - "map": "Felucca", - "priority": 50, - "music": "Dungeon9", - "rects": [{ "x1": 5886, "y1": 1281, "x2": 6143, "y2": 1535 }], - "go": { "x": 6032, "y": 1499, "z": 0 }, - "entrance": { "x": 1492, "y": 1641 } + "$type": "DungeonRegion", + "Name": "Misc Dungeons", + "Map": "Felucca", + "Priority": 50, + "Music": "Dungeon9", + "Area": [{ "x1": 5886, "y1": 1281, "x2": 6143, "y2": 1535 }], + "GoLocation": { "x": 6032, "y": 1499, "z": 0 }, + "Entrance": { "x": 1492, "y": 1641 } }, { - "name": "Orc Cave", - "type": "DungeonRegion", - "map": "Felucca", - "priority": 50, - "music": "Dungeon9", - "rects": [ + "$type": "DungeonRegion", + "Name": "Orc Cave", + "Map": "Felucca", + "Priority": 50, + "Music": "Dungeon9", + "Area": [ { "x1": 5281, "y1": 1283, "x2": 5373, "y2": 1386 }, { "x1": 5267, "y1": 1955, "x2": 5364, "y2": 2046 }, { "x1": 5127, "y1": 1941, "x2": 5164, "y2": 2024 } ], - "go": { "x": 5137, "y": 2015, "z": 0 }, - "entrance": { "x": 1014, "y": 1434 } + "GoLocation": { "x": 5137, "y": 2015, "z": 0 }, + "Entrance": { "x": 1014, "y": 1434 } }, { - "name": "A Cotton Field in Moonglow", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, + "$type": "BaseRegion", + "Name": "A Cotton Field in Moonglow", + "Map": "Felucca", + "Priority": 50, "rune": "A Cotton Field in Moonglow", - "rects": [{ "x1": 4557, "y1": 1471, "x2": 4577, "y2": 1481 }], - "go": { "x": 4567, "y": 1475, "z": 0 } + "Area": [{ "x1": 4557, "y1": 1471, "x2": 4577, "y2": 1481 }], + "GoLocation": { "x": 4567, "y": 1475, "z": 0 } }, { - "name": "A Wheatfield in Skara Brae 1", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, + "$type": "BaseRegion", + "Name": "A Wheatfield in Skara Brae 1", + "Map": "Felucca", + "Priority": 50, "rune": "A Wheatfield in Skara Brae", - "rects": [{ "x1": 796, "y1": 2152, "x2": 832, "y2": 2176 }], - "go": { "x": 813, "y": 2163, "z": 0 } + "Area": [{ "x1": 796, "y1": 2152, "x2": 832, "y2": 2176 }], + "GoLocation": { "x": 813, "y": 2163, "z": 0 } }, { - "name": "A Carrot Field in Skara Brae", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 816, "y1": 2251, "x2": 832, "y2": 2259 }], - "go": { "x": 823, "y": 2254, "z": 0 } + "$type": "BaseRegion", + "Name": "A Carrot Field in Skara Brae", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 816, "y1": 2251, "x2": 832, "y2": 2259 }], + "GoLocation": { "x": 823, "y": 2254, "z": 0 } }, { - "name": "An Onion Field in Skara Brae", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 816, "y1": 2261, "x2": 832, "y2": 2269 }], - "go": { "x": 823, "y": 2264, "z": 0 } + "$type": "BaseRegion", + "Name": "An Onion Field in Skara Brae", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 816, "y1": 2261, "x2": 832, "y2": 2269 }], + "GoLocation": { "x": 823, "y": 2264, "z": 0 } }, { - "name": "A Cabbage Field in Skara Brae 1", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 816, "y1": 2271, "x2": 832, "y2": 2279 }], - "go": { "x": 823, "y": 2264, "z": 0 } + "$type": "BaseRegion", + "Name": "A Cabbage Field in Skara Brae 1", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 816, "y1": 2271, "x2": 832, "y2": 2279 }], + "GoLocation": { "x": 823, "y": 2264, "z": 0 } }, { - "name": "A Cabbage Field in Skara Brae 2", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 816, "y1": 2281, "x2": 832, "y2": 2289 }], - "go": { "x": 823, "y": 2274, "z": 0 } + "$type": "BaseRegion", + "Name": "A Cabbage Field in Skara Brae 2", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 816, "y1": 2281, "x2": 832, "y2": 2289 }], + "GoLocation": { "x": 823, "y": 2274, "z": 0 } }, { - "name": "A Wheatfield in Skara Brae 2", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 835, "y1": 2344, "x2": 851, "y2": 2360 }], - "go": { "x": 843, "y": 2352, "z": 0 } + "$type": "BaseRegion", + "Name": "A Wheatfield in Skara Brae 2", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 835, "y1": 2344, "x2": 851, "y2": 2360 }], + "GoLocation": { "x": 843, "y": 2352, "z": 0 } }, { - "name": "A Cotton Field in Skara Brae", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 816, "y1": 2344, "x2": 832, "y2": 2368 }], - "go": { "x": 823, "y": 2355, "z": 0 } + "$type": "BaseRegion", + "Name": "A Cotton Field in Skara Brae", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 816, "y1": 2344, "x2": 832, "y2": 2368 }], + "GoLocation": { "x": 823, "y": 2355, "z": 0 } }, { - "name": "Shrine of Compassion", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 1851, "y1": 867, "x2": 1865, "y2": 881 }], - "go": { "x": 1856, "y": 872, "z": -1 } + "$type": "BaseRegion", + "Name": "Shrine of Compassion", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 1851, "y1": 867, "x2": 1865, "y2": 881 }], + "GoLocation": { "x": 1856, "y": 872, "z": -1 } }, { - "name": "Chaos Shrine", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 1456, "y1": 840, "x2": 1460, "y2": 847 }], - "go": { "x": 1456, "y": 854, "z": 0 } + "$type": "BaseRegion", + "Name": "Chaos Shrine", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 1456, "y1": 840, "x2": 1460, "y2": 847 }], + "GoLocation": { "x": 1456, "y": 854, "z": 0 } }, { - "name": "Shrine of Honesty", - "type": "BaseRegion", - "map": "Felucca", - "priority": 37, - "rects": [{ "x1": 4209, "y1": 560, "x2": 4216, "y2": 568 }], - "go": { "x": 4217, "y": 564, "z": 36 } + "$type": "BaseRegion", + "Name": "Shrine of Honesty", + "Map": "Felucca", + "Priority": 37, + "Area": [{ "x1": 4209, "y1": 560, "x2": 4216, "y2": 568 }], + "GoLocation": { "x": 4217, "y": 564, "z": 36 } }, { - "name": "Shrine of Honor", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 1721, "y1": 3525, "x2": 1729, "y2": 3531 }], - "go": { "x": 1730, "y": 3528, "z": 3 } + "$type": "BaseRegion", + "Name": "Shrine of Honor", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 1721, "y1": 3525, "x2": 1729, "y2": 3531 }], + "GoLocation": { "x": 1730, "y": 3528, "z": 3 } }, { - "name": "Shrine of Humility", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 4270, "y1": 3694, "x2": 4279, "y2": 3703 }], - "go": { "x": 4276, "y": 3699, "z": 0 } + "$type": "BaseRegion", + "Name": "Shrine of Humility", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 4270, "y1": 3694, "x2": 4279, "y2": 3703 }], + "GoLocation": { "x": 4276, "y": 3699, "z": 0 } }, { - "name": "Shrine of Justice", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 1297, "y1": 629, "x2": 1306, "y2": 638 }], - "go": { "x": 1301, "y": 639, "z": 16 } + "$type": "BaseRegion", + "Name": "Shrine of Justice", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 1297, "y1": 629, "x2": 1306, "y2": 638 }], + "GoLocation": { "x": 1301, "y": 639, "z": 16 } }, { - "name": "Shrine of Sacrifice", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 3352, "y1": 286, "x2": 3358, "y2": 293 }], - "go": { "x": 3355, "y": 299, "z": 9 } + "$type": "BaseRegion", + "Name": "Shrine of Sacrifice", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 3352, "y1": 286, "x2": 3358, "y2": 293 }], + "GoLocation": { "x": 3355, "y": 299, "z": 9 } }, { - "name": "Shrine of Spirituality", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [ + "$type": "BaseRegion", + "Name": "Shrine of Spirituality", + "Map": "Felucca", + "Priority": 50, + "Area": [ { "x1": 1590, "y1": 2485, "x2": 1600, "y2": 2496 }, { "x1": 1599, "y1": 2488, "x2": 1609, "y2": 2493 } ], - "go": { "x": 1589, "y": 2485, "z": 5 } + "GoLocation": { "x": 1589, "y": 2485, "z": 5 } }, { - "name": "Shrine of Valor", - "type": "BaseRegion", - "map": "Felucca", - "priority": 37, - "rects": [{ "x1": 2488, "y1": 3928, "x2": 2497, "y2": 3939 }], - "go": { "x": 2496, "y": 3932, "z": 0 } + "$type": "BaseRegion", + "Name": "Shrine of Valor", + "Map": "Felucca", + "Priority": 37, + "Area": [{ "x1": 2488, "y1": 3928, "x2": 2497, "y2": 3939 }], + "GoLocation": { "x": 2496, "y": 3932, "z": 0 } }, { - "name": "South Britannian Sea", - "type": "BaseRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 688, "y1": 3700, "x2": 2100, "y2": 4080 }] + "$type": "BaseRegion", + "Name": "South Britannian Sea", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 688, "y1": 3700, "x2": 2100, "y2": 4080 }] }, { - "name": "Paroxysmus Exit", - "type": "MondainRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 5620, "y1": 3032, "x2": 5630, "y2": 3042 }], - "go": { "x": 5623, "y": 3038, "z": 15 } + "$type": "MondainRegion", + "Name": "Paroxysmus Exit", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 5620, "y1": 3032, "x2": 5630, "y2": 3042 }], + "GoLocation": { "x": 5623, "y": 3038, "z": 15 } }, { - "name": "Sanctuary Entrance", - "type": "MondainRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 759, "y1": 1635, "x2": 771, "y2": 1647 }], - "go": { "x": 762, "y": 1645, "z": 0 } + "$type": "MondainRegion", + "Name": "Sanctuary Entrance", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 759, "y1": 1635, "x2": 771, "y2": 1647 }], + "GoLocation": { "x": 762, "y": 1645, "z": 0 } }, { - "name": "Solen Hives", - "type": "DungeonRegion", - "map": "Felucca", - "priority": 50, - "rects": [{ "x1": 5640, "y1": 1776, "x2": 5935, "y2": 2039 }], - "go": { "x": 5774, "y": 1896, "z": 20 } + "$type": "DungeonRegion", + "Name": "Solen Hives", + "Map": "Felucca", + "Priority": 50, + "Area": [{ "x1": 5640, "y1": 1776, "x2": 5935, "y2": 2039 }], + "GoLocation": { "x": 5774, "y": 1896, "z": 20 } }, { - "name": "Khaldun", - "type": "DungeonRegion", - "map": "Trammel", - "priority": 50, - "music": "Dungeon9", - "rects": [{ "x1": 5381, "y1": 1284, "x2": 5628, "y2": 1509 }], - "go": { "x": 5571, "y": 1302, "z": 0 }, - "entrance": { "x": 5882, "y": 3819 } + "$type": "DungeonRegion", + "Name": "Khaldun", + "Map": "Trammel", + "Priority": 50, + "Music": "Dungeon9", + "Area": [{ "x1": 5381, "y1": 1284, "x2": 5628, "y2": 1509 }], + "GoLocation": { "x": 5571, "y": 1302, "z": 0 }, + "Entrance": { "x": 5882, "y": 3819 } }, { - "name": "Underwater World", - "type": "NoTravelSpellsAllowedRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 6251, "y1": 1613, "x2": 6473, "y2": 1813 }] + "$type": "NoTravelSpellsAllowedRegion", + "Name": "Underwater World", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 6251, "y1": 1613, "x2": 6473, "y2": 1813 }] }, { - "name": "Moongates", - "type": "GuardedRegion", - "map": "Trammel", - "priority": 50, - "rects": [ + "$type": "GuardedRegion", + "Name": "Moongates", + "Map": "Trammel", + "Priority": 50, + "Area": [ { "x1": 1330, "y1": 1991, "x2": 1343, "y2": 2004 }, { "x1": 1494, "y1": 3767, "x2": 1506, "y2": 3778 }, { "x1": 2694, "y1": 685, "x2": 2709, "y2": 701 }, @@ -1275,98 +1276,98 @@ ] }, { - "name": "Heartwood", - "type": "TownRegion", - "map": "Trammel", - "priority": 50, - "music": "ElfCity", - "rects": [{ "x1": 6911, "y1": 255, "x2": 7168, "y2": 512 }], - "go": { "x": 6984, "y": 337, "z": 0 }, - "entrance": { "x": 535, "y": 995 } + "$type": "TownRegion", + "Name": "Heartwood", + "Map": "Trammel", + "Priority": 50, + "Music": "ElfCity", + "Area": [{ "x1": 6911, "y1": 255, "x2": 7168, "y2": 512 }], + "GoLocation": { "x": 6984, "y": 337, "z": 0 }, + "Entrance": { "x": 535, "y": 995 } }, { - "name": "Sanctuary", - "type": "MondainRegion", - "map": "Trammel", - "priority": 50, - "music": "Dungeon9", - "rects": [{ "x1": 6157, "y1": 4, "x2": 6399, "y2": 255 }], - "go": { "x": 6173, "y": 23, "z": 0 }, - "entrance": { "x": 764, "y": 1646 } + "$type": "MondainRegion", + "Name": "Sanctuary", + "Map": "Trammel", + "Priority": 50, + "Music": "Dungeon9", + "Area": [{ "x1": 6157, "y1": 4, "x2": 6399, "y2": 255 }], + "GoLocation": { "x": 6173, "y": 23, "z": 0 }, + "Entrance": { "x": 764, "y": 1646 } }, { - "name": "Painted Caves", - "type": "MondainRegion", - "map": "Trammel", - "priority": 50, - "music": "Dungeon9", - "rects": [{ "x1": 6240, "y1": 860, "x2": 6310, "y2": 920 }], - "go": { "x": 6308, "y": 892, "z": -1 }, - "entrance": { "x": 1716, "y": 892 } + "$type": "MondainRegion", + "Name": "Painted Caves", + "Map": "Trammel", + "Priority": 50, + "Music": "Dungeon9", + "Area": [{ "x1": 6240, "y1": 860, "x2": 6310, "y2": 920 }], + "GoLocation": { "x": 6308, "y": 892, "z": -1 }, + "Entrance": { "x": 1716, "y": 892 } }, { - "name": "Prism of Light", - "type": "MondainRegion", - "map": "Trammel", - "priority": 50, - "music": "Dungeon9", - "rects": [{ "x1": 6400, "y1": 0, "x2": 6621, "y2": 255 }], - "go": { "x": 6474, "y": 188, "z": 0 }, - "entrance": { "x": 3784, "y": 1097 } + "$type": "MondainRegion", + "Name": "Prism of Light", + "Map": "Trammel", + "Priority": 50, + "Music": "Dungeon9", + "Area": [{ "x1": 6400, "y1": 0, "x2": 6621, "y2": 255 }], + "GoLocation": { "x": 6474, "y": 188, "z": 0 }, + "Entrance": { "x": 3784, "y": 1097 } }, { - "name": "Blighted Grove", - "type": "MondainRegion", - "map": "Trammel", - "priority": 50, - "music": "MelisandesLair", - "rects": [{ "x1": 6440, "y1": 820, "x2": 6600, "y2": 970 }], - "go": { "x": 6478, "y": 863, "z": 11 }, - "entrance": { "x": 587, "y": 1641 } + "$type": "MondainRegion", + "Name": "Blighted Grove", + "Map": "Trammel", + "Priority": 50, + "Music": "MelisandesLair", + "Area": [{ "x1": 6440, "y1": 820, "x2": 6600, "y2": 970 }], + "GoLocation": { "x": 6478, "y": 863, "z": 11 }, + "Entrance": { "x": 587, "y": 1641 } }, { - "name": "Palace of Paroxysmus", - "type": "MondainRegion", - "map": "Trammel", - "priority": 50, - "music": "ParoxysmusLair", - "rects": [{ "x1": 6191, "y1": 311, "x2": 6561, "y2": 671 }], - "go": { "x": 6222, "y": 335, "z": 60 }, - "entrance": { "x": 5574, "y": 3024 } + "$type": "MondainRegion", + "Name": "Palace of Paroxysmus", + "Map": "Trammel", + "Priority": 50, + "Music": "ParoxysmusLair", + "Area": [{ "x1": 6191, "y1": 311, "x2": 6561, "y2": 671 }], + "GoLocation": { "x": 6222, "y": 335, "z": 60 }, + "Entrance": { "x": 5574, "y": 3024 } }, { - "name": "Bravehorn's drinking pool", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 1302, "y1": 2331, "x2": 1340, "y2": 2353 }] + "$type": "BaseRegion", + "Name": "Bravehorn's drinking pool", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 1302, "y1": 2331, "x2": 1340, "y2": 2353 }] }, { - "name": "Huntsman's Forest", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 1595, "y1": 550, "x2": 1715, "y2": 670 }] + "$type": "BaseRegion", + "Name": "Huntsman's Forest", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 1595, "y1": 550, "x2": 1715, "y2": 670 }] }, { - "name": "Cove", - "type": "TownRegion", - "map": "Trammel", - "priority": 50, - "music": "Cove", - "rects": [ + "$type": "TownRegion", + "Name": "Cove", + "Map": "Trammel", + "Priority": 50, + "Music": "Cove", + "Area": [ { "x1": 2200, "y1": 1110, "z1": 0, "x2": 2250, "y2": 1160, "z2": 128 }, { "x1": 2200, "y1": 1160, "z1": 0, "x2": 2286, "y2": 1246, "z2": 128 } ], - "go": { "x": 2275, "y": 1210, "z": 0 } + "GoLocation": { "x": 2275, "y": 1210, "z": 0 } }, { - "name": "Britain", - "type": "TownRegion", - "map": "Trammel", - "priority": 50, - "music": "Britain1", - "rects": [ + "$type": "TownRegion", + "Name": "Britain", + "Map": "Trammel", + "Priority": 50, + "Music": "Britain1", + "Area": [ { "x1": 1416, "y1": 1498, "z1": -10, "x2": 1740, "y2": 1777, "z2": 128 }, { "x1": 1500, "y1": 1408, "z1": 0, "x2": 1546, "y2": 1498, "z2": 128 }, { "x1": 1385, "y1": 1538, "z1": -10, "x2": 1416, "y2": 1777, "z2": 128 }, @@ -1374,14 +1375,14 @@ { "x1": 1385, "y1": 1777, "z1": 0, "x2": 1416, "y2": 1907, "z2": 128 }, { "x1": 1093, "y1": 1538, "z1": 0, "x2": 1385, "y2": 1907, "z2": 128 } ], - "go": { "x": 1495, "y": 1629, "z": 10 } + "GoLocation": { "x": 1495, "y": 1629, "z": 10 } }, { - "type": "BaseRegion", - "map": "Trammel", - "parent": "Britain", - "logoutDelay": false, - "rects": [ + "$type": "BaseRegion", + "Map": "Trammel", + "Parent": "Britain", + "LogoutDelay": false, + "Area": [ { "x1": 1492, "y1": 1602, "z1": 0, "x2": 1500, "y2": 1621, "z2": 128 }, { "x1": 1500, "y1": 1610, "z1": 0, "x2": 1508, "y2": 1626, "z2": 128 }, { "x1": 1576, "y1": 1584, "z1": 0, "x2": 1600, "y2": 1600, "z2": 128 }, @@ -1398,133 +1399,133 @@ ] }, { - "name": "A Wheatfield in Britain 1", - "type": "BaseRegion", - "map": "Trammel", - "parent": "Britain", - "rects": [{ "x1": 1120, "y1": 1776, "x2": 1152, "y2": 1808 }], - "go": { "x": 1135, "y": 1791, "z": 0 } + "$type": "BaseRegion", + "Name": "A Wheatfield in Britain 1", + "Map": "Trammel", + "Parent": "Britain", + "Area": [{ "x1": 1120, "y1": 1776, "x2": 1152, "y2": 1808 }], + "GoLocation": { "x": 1135, "y": 1791, "z": 0 } }, { - "name": "A Wheatfield in Britain 2", - "type": "BaseRegion", - "map": "Trammel", - "parent": "Britain", - "rects": [{ "x1": 1184, "y1": 1808, "x2": 1216, "y2": 1840 }], - "go": { "x": 1199, "y": 1823, "z": 0 } + "$type": "BaseRegion", + "Name": "A Wheatfield in Britain 2", + "Map": "Trammel", + "Parent": "Britain", + "Area": [{ "x1": 1184, "y1": 1808, "x2": 1216, "y2": 1840 }], + "GoLocation": { "x": 1199, "y": 1823, "z": 0 } }, { - "name": "A Wheatfield in Britain 3", - "type": "BaseRegion", - "map": "Trammel", - "parent": "Britain", - "rects": [{ "x1": 1216, "y1": 1872, "x2": 1248, "y2": 1904 }], - "go": { "x": 1231, "y": 1887, "z": 0 } + "$type": "BaseRegion", + "Name": "A Wheatfield in Britain 3", + "Map": "Trammel", + "Parent": "Britain", + "Area": [{ "x1": 1216, "y1": 1872, "x2": 1248, "y2": 1904 }], + "GoLocation": { "x": 1231, "y": 1887, "z": 0 } }, { - "name": "A Carrot Field in Britain 1", - "type": "BaseRegion", - "map": "Trammel", - "parent": "Britain", - "rects": [{ "x1": 1208, "y1": 1712, "x2": 1224, "y2": 1736 }], - "go": { "x": 1215, "y": 1723, "z": 0 } + "$type": "BaseRegion", + "Name": "A Carrot Field in Britain 1", + "Map": "Trammel", + "Parent": "Britain", + "Area": [{ "x1": 1208, "y1": 1712, "x2": 1224, "y2": 1736 }], + "GoLocation": { "x": 1215, "y": 1723, "z": 0 } }, { - "name": "An Onion Field in Britain 1", - "type": "BaseRegion", - "map": "Trammel", - "parent": "Britain", - "rects": [{ "x1": 1224, "y1": 1712, "x2": 1240, "y2": 1736 }], - "go": { "x": 1231, "y": 1723, "z": 0 } + "$type": "BaseRegion", + "Name": "An Onion Field in Britain 1", + "Map": "Trammel", + "Parent": "Britain", + "Area": [{ "x1": 1224, "y1": 1712, "x2": 1240, "y2": 1736 }], + "GoLocation": { "x": 1231, "y": 1723, "z": 0 } }, { - "name": "A Cabbage Field in Britain 1", - "type": "BaseRegion", - "map": "Trammel", - "parent": "Britain", - "rects": [{ "x1": 1176, "y1": 1672, "x2": 1192, "y2": 1695 }], - "go": { "x": 1183, "y": 1683, "z": 0 } + "$type": "BaseRegion", + "Name": "A Cabbage Field in Britain 1", + "Map": "Trammel", + "Parent": "Britain", + "Area": [{ "x1": 1176, "y1": 1672, "x2": 1192, "y2": 1695 }], + "GoLocation": { "x": 1183, "y": 1683, "z": 0 } }, { - "name": "A Turnip Field in Britain 1", - "type": "BaseRegion", - "map": "Trammel", - "parent": "Britain", - "rects": [{ "x1": 1192, "y1": 1672, "x2": 1208, "y2": 1696 }], - "go": { "x": 1199, "y": 1683, "z": 0 } + "$type": "BaseRegion", + "Name": "A Turnip Field in Britain 1", + "Map": "Trammel", + "Parent": "Britain", + "Area": [{ "x1": 1192, "y1": 1672, "x2": 1208, "y2": 1696 }], + "GoLocation": { "x": 1199, "y": 1683, "z": 0 } }, { - "name": "A Wheatfield in Britain 4", - "type": "BaseRegion", - "map": "Trammel", - "parent": "Britain", - "rects": [{ "x1": 1104, "y1": 1608, "x2": 1136, "y2": 1640 }], - "go": { "x": 1120, "y": 1624, "z": 0 } + "$type": "BaseRegion", + "Name": "A Wheatfield in Britain 4", + "Map": "Trammel", + "Parent": "Britain", + "Area": [{ "x1": 1104, "y1": 1608, "x2": 1136, "y2": 1640 }], + "GoLocation": { "x": 1120, "y": 1624, "z": 0 } }, { - "name": "A Wheatfield in Britain 5", - "type": "BaseRegion", - "map": "Trammel", - "parent": "Britain", - "rects": [{ "x1": 1136, "y1": 1560, "x2": 1168, "y2": 1592 }], - "go": { "x": 1152, "y": 1576, "z": 0 } + "$type": "BaseRegion", + "Name": "A Wheatfield in Britain 5", + "Map": "Trammel", + "Parent": "Britain", + "Area": [{ "x1": 1136, "y1": 1560, "x2": 1168, "y2": 1592 }], + "GoLocation": { "x": 1152, "y": 1576, "z": 0 } }, { - "name": "A Turnip Field in Britain 2", - "type": "BaseRegion", - "map": "Trammel", - "parent": "Britain", - "rects": [{ "x1": 1208, "y1": 1592, "x2": 1224, "y2": 1616 }], - "go": { "x": 1216, "y": 1604, "z": 0 } + "$type": "BaseRegion", + "Name": "A Turnip Field in Britain 2", + "Map": "Trammel", + "Parent": "Britain", + "Area": [{ "x1": 1208, "y1": 1592, "x2": 1224, "y2": 1616 }], + "GoLocation": { "x": 1216, "y": 1604, "z": 0 } }, { - "name": "A Carrot Field in Britain 2", - "type": "BaseRegion", - "map": "Trammel", - "parent": "Britain", - "rects": [{ "x1": 1224, "y1": 1592, "x2": 1240, "y2": 1616 }], - "go": { "x": 1232, "y": 1604, "z": 0 } + "$type": "BaseRegion", + "Name": "A Carrot Field in Britain 2", + "Map": "Trammel", + "Parent": "Britain", + "Area": [{ "x1": 1224, "y1": 1592, "x2": 1240, "y2": 1616 }], + "GoLocation": { "x": 1232, "y": 1604, "z": 0 } }, { - "name": "Britain Graveyard", - "type": "NoHousingRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 1333, "y1": 1441, "x2": 1417, "y2": 1523 }], - "go": { "x": 1384, "y": 1492, "z": 10 } + "$type": "NoHousingRegion", + "Name": "Britain Graveyard", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 1333, "y1": 1441, "x2": 1417, "y2": 1523 }], + "GoLocation": { "x": 1384, "y": 1492, "z": 10 } }, { - "name": "Jhelom Islands", - "type": "NoHousingRegion", - "map": "Trammel", - "priority": 50, - "music": "Jhelom", - "rects": [ + "$type": "NoHousingRegion", + "Name": "Jhelom Islands", + "Map": "Trammel", + "Priority": 50, + "Music": "Jhelom", + "Area": [ { "x1": 1111, "y1": 3567, "x2": 1144, "y2": 3588 }, { "x1": 1078, "y1": 3588, "x2": 1202, "y2": 3709 }, { "x1": 1224, "y1": 3592, "x2": 1533, "y2": 4065 } ], - "go": { "x": 1383, "y": 3815, "z": 0 } + "GoLocation": { "x": 1383, "y": 3815, "z": 0 } }, { - "name": "Jhelom", - "type": "TownRegion", - "map": "Trammel", - "parent": "Jhelom Islands", - "music": "Jhelom", - "rects": [ + "$type": "TownRegion", + "Name": "Jhelom", + "Map": "Trammel", + "Parent": "Jhelom Islands", + "Music": "Jhelom", + "Area": [ { "x1": 1303, "y1": 3670, "z1": -20, "x2": 1492, "y2": 3895, "z2": 128 }, { "x1": 1338, "y1": 3895, "z1": -20, "x2": 1412, "y2": 3923, "z2": 128 }, { "x1": 1383, "y1": 3951, "z1": -20, "x2": 1492, "y2": 4045, "z2": 128 } ], - "go": { "x": 1383, "y": 3815, "z": 0 } + "GoLocation": { "x": 1383, "y": 3815, "z": 0 } }, { - "type": "BaseRegion", - "map": "Trammel", - "parent": "Jhelom", - "logoutDelay": false, - "rects": [ + "$type": "BaseRegion", + "Map": "Trammel", + "Parent": "Jhelom", + "LogoutDelay": false, + "Area": [ { "x1": 1352, "y1": 3800, "z1": -20, "x2": 1368, "y2": 3832, "z2": 128 }, { "x1": 1368, "y1": 3808, "z1": -20, "x2": 1376, "y2": 3824, "z2": 128 }, { "x1": 1432, "y1": 3768, "z1": -20, "x2": 1464, "y2": 3776, "z2": 128 }, @@ -1532,47 +1533,46 @@ ] }, { - "name": "Minoc", - "type": "TownRegion", - "map": "Trammel", - "priority": 50, - "music": "Minoc", - "rects": [ + "$type": "TownRegion", + "Name": "Minoc", + "Map": "Trammel", + "Priority": 50, + "Music": "Minoc", + "Area": [ { "x1": 2411, "y1": 366, "x2": 2546, "y2": 607 }, { "x1": 2548, "y1": 495, "x2": 2620, "y2": 550 }, { "x1": 2564, "y1": 585, "x2": 2567, "y2": 627 }, { "x1": 2567, "y1": 585, "x2": 2628, "y2": 646 }, { "x1": 2499, "y1": 627, "x2": 2567, "y2": 690 } ], - "go": { "x": 2466, "y": 544, "z": 0 } + "GoLocation": { "x": 2466, "y": 544, "z": 0 } }, { - "type": "BaseRegion", - "map": "Trammel", - "parent": "Minoc", - "logoutDelay": false, - "rects": [ + "$type": "BaseRegion", + "Map": "Trammel", + "Parent": "Minoc", + "LogoutDelay": false, + "Area": [ { "x1": 2457, "y1": 397, "x2": 2497, "y2": 405 }, { "x1": 2465, "y1": 405, "x2": 2473, "y2": 413 }, { "x1": 2481, "y1": 405, "x2": 2489, "y2": 413 } ] }, { - "name": "Haven Island", - "type": "NoHousingRegion", - "map": "Trammel", - "priority": 50, - "smartNoHousing": true, - "rects": [{ "x1": 3314, "y1": 2345, "x2": 3814, "y2": 3095 }], - "go": { "x": 3627, "y": 2606, "z": 0 } + "$type": "NoHousingRegion", + "Name": "Haven Island", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 3314, "y1": 2345, "x2": 3814, "y2": 3095 }], + "GoLocation": { "x": 3627, "y": 2606, "z": 0 } }, { - "name": "Trinsic", - "type": "TownRegion", - "map": "Trammel", - "priority": 50, - "music": "Trinsic", - "rects": [ + "$type": "TownRegion", + "Name": "Trinsic", + "Map": "Trammel", + "Priority": 50, + "Music": "Trinsic", + "Area": [ { "x1": 1856, "y1": 2636, "x2": 1931, "y2": 2664 }, { "x1": 1816, "y1": 2664, "x2": 2099, "y2": 2895 }, { "x1": 2099, "y1": 2782, "x2": 2117, "y2": 2807 }, @@ -1580,14 +1580,14 @@ { "x1": 1796, "y1": 2696, "z1": 0, "x2": 1816, "y2": 2763, "z2": 128 }, { "x1": 1800, "y1": 2796, "z1": 0, "x2": 1816, "y2": 2848, "z2": 128 } ], - "go": { "x": 1867, "y": 2780, "z": 0 } + "GoLocation": { "x": 1867, "y": 2780, "z": 0 } }, { - "type": "BaseRegion", - "map": "Trammel", - "parent": "Trinsic", - "logoutDelay": false, - "rects": [ + "$type": "BaseRegion", + "Map": "Trammel", + "Parent": "Trinsic", + "LogoutDelay": false, + "Area": [ { "x1": 1834, "y1": 2728, "x2": 1856, "y2": 2744 }, { "x1": 2024, "y1": 2784, "x2": 2040, "y2": 2804 }, { "x1": 2026, "y1": 2804, "x2": 2040, "y2": 2806 }, @@ -1597,25 +1597,25 @@ ] }, { - "name": "Vesper", - "type": "TownRegion", - "map": "Trammel", - "priority": 50, - "music": "Vesper", - "rects": [ + "$type": "TownRegion", + "Name": "Vesper", + "Map": "Trammel", + "Priority": 50, + "Music": "Vesper", + "Area": [ { "x1": 2893, "y1": 598, "x2": 3014, "y2": 648 }, { "x1": 2816, "y1": 648, "x2": 3065, "y2": 1013 }, { "x1": 2734, "y1": 944, "x2": 2816, "y2": 948 }, { "x1": 2728, "y1": 948, "x2": 2816, "y2": 1001 } ], - "go": { "x": 2899, "y": 676, "z": 0 } + "GoLocation": { "x": 2899, "y": 676, "z": 0 } }, { - "type": "BaseRegion", - "map": "Trammel", - "parent": "Vesper", - "logoutDelay": false, - "rects": [ + "$type": "BaseRegion", + "Map": "Trammel", + "Parent": "Vesper", + "LogoutDelay": false, + "Area": [ { "x1": 2952, "y1": 864, "x2": 2968, "y2": 896 }, { "x1": 2968, "y1": 872, "x2": 2976, "y2": 888 }, { "x1": 2776, "y1": 952, "x2": 2792, "y2": 984 }, @@ -1625,12 +1625,12 @@ ] }, { - "name": "Yew", - "type": "TownRegion", - "map": "Trammel", - "priority": 50, - "music": "Yew", - "rects": [ + "$type": "TownRegion", + "Name": "Yew", + "Map": "Trammel", + "Priority": 50, + "Music": "Yew", + "Area": [ { "x1": 92, "y1": 656, "z1": 0, "x2": 441, "y2": 881, "z2": 128 }, { "x1": 441, "y1": 746, "z1": 0, "x2": 657, "y2": 881, "z2": 128 }, { "x1": 258, "y1": 881, "z1": 0, "x2": 657, "y2": 1261, "z2": 128 }, @@ -1638,67 +1638,67 @@ { "x1": 657, "y1": 806, "z1": 0, "x2": 674, "y2": 834, "z2": 128 }, { "x1": 718, "y1": 874, "z1": 0, "x2": 756, "y2": 896, "z2": 128 } ], - "go": { "x": 546, "y": 992, "z": 0 } + "GoLocation": { "x": 546, "y": 992, "z": 0 } }, { - "type": "BaseRegion", - "map": "Trammel", - "parent": "Yew", - "logoutDelay": false, - "rects": [{ "x1": 600, "y1": 808, "z1": 0, "x2": 624, "y2": 832, "z2": 128 }] + "$type": "BaseRegion", + "Map": "Trammel", + "Parent": "Yew", + "LogoutDelay": false, + "Area": [{ "x1": 600, "y1": 808, "z1": 0, "x2": 624, "y2": 832, "z2": 128 }] }, { - "name": "A Field of Sheep in Yew 1", - "type": "BaseRegion", - "map": "Trammel", - "parent": "Yew", + "$type": "BaseRegion", + "Name": "A Field of Sheep in Yew 1", + "Map": "Trammel", + "Parent": "Yew", "rune": "A Field of Sheep in Yew", - "rects": [{ "x1": 664, "y1": 928, "x2": 686, "y2": 950 }], - "go": { "x": 675, "y": 939, "z": 0 } + "Area": [{ "x1": 664, "y1": 928, "x2": 686, "y2": 950 }], + "GoLocation": { "x": 675, "y": 939, "z": 0 } }, { - "name": "A Field of Sheep in Yew 2", - "type": "BaseRegion", - "map": "Trammel", - "parent": "Yew", + "$type": "BaseRegion", + "Name": "A Field of Sheep in Yew 2", + "Map": "Trammel", + "Parent": "Yew", "rune": "A Field of Sheep in Yew", - "rects": [{ "x1": 664, "y1": 1168, "x2": 686, "y2": 1190 }], - "go": { "x": 675, "y": 1179, "z": 0 } + "Area": [{ "x1": 664, "y1": 1168, "x2": 686, "y2": 1190 }], + "GoLocation": { "x": 675, "y": 1179, "z": 0 } }, { - "name": "A Farm in Yew", - "type": "BaseRegion", - "map": "Trammel", - "parent": "Yew", + "$type": "BaseRegion", + "Name": "A Farm in Yew", + "Map": "Trammel", + "Parent": "Yew", "rune": "A Farm in Yew", - "rects": [{ "x1": 560, "y1": 1088, "x2": 582, "y2": 1110 }], - "go": { "x": 571, "y": 1099, "z": 0 } + "Area": [{ "x1": 560, "y1": 1088, "x2": 582, "y2": 1110 }], + "GoLocation": { "x": 571, "y": 1099, "z": 0 } }, { - "name": "A Wheatfield in Yew 1", - "type": "BaseRegion", - "map": "Trammel", - "parent": "Yew", + "$type": "BaseRegion", + "Name": "A Wheatfield in Yew 1", + "Map": "Trammel", + "Parent": "Yew", "rune": "A Wheatfield in Yew", - "rects": [{ "x1": 560, "y1": 1232, "x2": 576, "y2": 1248 }], - "go": { "x": 567, "y": 1239, "z": 0 } + "Area": [{ "x1": 560, "y1": 1232, "x2": 576, "y2": 1248 }], + "GoLocation": { "x": 567, "y": 1239, "z": 0 } }, { - "name": "A Wheatfield in Yew 2", - "type": "BaseRegion", - "map": "Trammel", - "parent": "Yew", + "$type": "BaseRegion", + "Name": "A Wheatfield in Yew 2", + "Map": "Trammel", + "Parent": "Yew", "rune": "A Wheatfield in Yew", - "rects": [{ "x1": 368, "y1": 1176, "x2": 382, "y2": 1208 }], - "go": { "x": 375, "y": 1191, "z": 0 } + "Area": [{ "x1": 368, "y1": 1176, "x2": 382, "y2": 1208 }], + "GoLocation": { "x": 375, "y": 1191, "z": 0 } }, { - "name": "Wind", - "type": "TownRegion", - "map": "Trammel", - "priority": 50, - "music": "Wind", - "rects": [ + "$type": "TownRegion", + "Name": "Wind", + "Map": "Trammel", + "Priority": 50, + "Music": "Wind", + "Area": [ { "x1": 5294, "y1": 19, "x2": 5366, "y2": 139 }, { "x1": 5132, "y1": 58, "x2": 5213, "y2": 126 }, { "x1": 5197, "y1": 126, "x2": 5252, "y2": 204 }, @@ -1711,14 +1711,14 @@ { "x1": 5252, "y1": 178, "x2": 5272, "y2": 183 }, { "x1": 5252, "y1": 183, "x2": 5262, "y2": 193 } ], - "go": { "x": 5223, "y": 190, "z": 5 } + "GoLocation": { "x": 5223, "y": 190, "z": 5 } }, { - "type": "BaseRegion", - "map": "Trammel", - "parent": "Wind", - "logoutDelay": false, - "rects": [ + "$type": "BaseRegion", + "Map": "Trammel", + "Parent": "Wind", + "LogoutDelay": false, + "Area": [ { "x1": 5159, "y1": 15, "x2": 5184, "y2": 24 }, { "x1": 5159, "y1": 24, "x2": 5168, "y2": 40 }, { "x1": 5175, "y1": 24, "x2": 5184, "y2": 32 }, @@ -1729,40 +1729,40 @@ ] }, { - "name": "Serpent's Hold", - "type": "TownRegion", - "map": "Trammel", - "priority": 50, - "music": "Serpents", - "rects": [{ "x1": 2868, "y1": 3324, "z1": 0, "x2": 3073, "y2": 3519, "z2": 128 }], - "go": { "x": 3010, "y": 3371, "z": 15 } + "$type": "TownRegion", + "Name": "Serpent's Hold", + "Map": "Trammel", + "Priority": 50, + "Music": "Serpents", + "Area": [{ "x1": 2868, "y1": 3324, "z1": 0, "x2": 3073, "y2": 3519, "z2": 128 }], + "GoLocation": { "x": 3010, "y": 3371, "z": 15 } }, { - "type": "BaseRegion", - "map": "Trammel", - "parent": "Serpent's Hold", - "logoutDelay": false, - "rects": [ + "$type": "BaseRegion", + "Map": "Trammel", + "Parent": "Serpent's Hold", + "LogoutDelay": false, + "Area": [ { "x1": 2960, "y1": 3400, "z1": 0, "x2": 2976, "y2": 3416, "z2": 128 }, { "x1": 2968, "y1": 3416, "z1": 0, "x2": 2976, "y2": 3432, "z2": 128 }, { "x1": 3008, "y1": 3450, "z1": 0, "x2": 3022, "y2": 3464, "z2": 128 } ] }, { - "name": "Skara Brae", - "type": "TownRegion", - "map": "Trammel", - "priority": 50, - "music": "Skarabra", - "rects": [{ "x1": 538, "y1": 2107, "x2": 688, "y2": 2297 }], - "go": { "x": 632, "y": 2233, "z": 0 } + "$type": "TownRegion", + "Name": "Skara Brae", + "Map": "Trammel", + "Priority": 50, + "Music": "Skarabra", + "Area": [{ "x1": 538, "y1": 2107, "x2": 688, "y2": 2297 }], + "GoLocation": { "x": 632, "y": 2233, "z": 0 } }, { - "type": "BaseRegion", - "map": "Trammel", - "parent": "Skara Brae", - "logoutDelay": false, - "rects": [ + "$type": "BaseRegion", + "Map": "Trammel", + "Parent": "Skara Brae", + "LogoutDelay": false, + "Area": [ { "x1": 600, "y1": 2232, "x2": 616, "y2": 2256 }, { "x1": 592, "y1": 2240, "x2": 600, "y2": 2256 }, { "x1": 616, "y1": 2240, "x2": 624, "y2": 2256 }, @@ -1771,20 +1771,20 @@ ] }, { - "name": "Nujel'm", - "type": "TownRegion", - "map": "Trammel", - "priority": 50, - "music": "Nujelm", - "rects": [{ "x1": 3475, "y1": 1000, "z1": 0, "x2": 3835, "y2": 1435, "z2": 128 }], - "go": { "x": 3732, "y": 1279, "z": 0 } + "$type": "TownRegion", + "Name": "Nujel'm", + "Map": "Trammel", + "Priority": 50, + "Music": "Nujelm", + "Area": [{ "x1": 3475, "y1": 1000, "z1": 0, "x2": 3835, "y2": 1435, "z2": 128 }], + "GoLocation": { "x": 3732, "y": 1279, "z": 0 } }, { - "type": "BaseRegion", - "map": "Trammel", - "parent": "Nujel'm", - "logoutDelay": false, - "rects": [ + "$type": "BaseRegion", + "Map": "Trammel", + "Parent": "Nujel'm", + "LogoutDelay": false, + "Area": [ { "x1": 3736, "y1": 1184, "z1": 0, "x2": 3752, "y2": 1207, "z2": 128 }, { "x1": 3728, "y1": 1192, "z1": 0, "x2": 3736, "y2": 1207, "z2": 128 }, { "x1": 3728, "y1": 1288, "z1": 0, "x2": 3751, "y2": 1303, "z2": 128 }, @@ -1801,12 +1801,12 @@ ] }, { - "name": "Moonglow", - "type": "TownRegion", - "map": "Trammel", - "priority": 50, - "music": "Moonglow", - "rects": [ + "$type": "TownRegion", + "Name": "Moonglow", + "Map": "Trammel", + "Priority": 50, + "Music": "Moonglow", + "Area": [ { "x1": 4535, "y1": 844, "z1": 0, "x2": 4555, "y2": 847, "z2": 128 }, { "x1": 4530, "y1": 847, "z1": 0, "x2": 4561, "y2": 908, "z2": 128 }, { "x1": 4521, "y1": 914, "z1": 0, "x2": 4577, "y2": 963, "z2": 128 }, @@ -1832,15 +1832,15 @@ { "x1": 4405, "y1": 1451, "z1": 0, "x2": 4428, "y2": 1474, "z2": 128 }, { "x1": 4483, "y1": 1468, "z1": 0, "x2": 4504, "y2": 1481, "z2": 128 } ], - "go": { "x": 4442, "y": 1172, "z": 0 } + "GoLocation": { "x": 4442, "y": 1172, "z": 0 } }, { - "name": "The Scholar's Inn", - "type": "BaseRegion", - "map": "Trammel", - "parent": "Moonglow", - "logoutDelay": false, - "rects": [ + "$type": "BaseRegion", + "Name": "The Scholar's Inn", + "Map": "Trammel", + "Parent": "Moonglow", + "LogoutDelay": false, + "Area": [ { "x1": 4384, "y1": 1152, "z1": 0, "x2": 4392, "y2": 1176, "z2": 128 }, { "x1": 4392, "y1": 1160, "z1": 0, "x2": 4408, "y2": 1168, "z2": 128 }, { "x1": 4400, "y1": 1152, "z1": 0, "x2": 4408, "y2": 1160, "z2": 128 }, @@ -1850,12 +1850,12 @@ ] }, { - "name": "Magincia", - "type": "NewMaginciaRegion", - "map": "Trammel", - "priority": 50, - "music": "Magincia", - "rects": [ + "$type": "NewMaginciaRegion", + "Name": "Magincia", + "Map": "Trammel", + "Priority": 50, + "Music": "Magincia", + "Area": [ { "x1": 3632, "y1": 2032, "x2": 3682, "y2": 2102 }, { "x1": 3624, "y1": 2162, "x2": 3719, "y2": 2232 }, { "x1": 3752, "y1": 2046, "x2": 3804, "y2": 2094 }, @@ -1863,34 +1863,34 @@ { "x1": 3652, "y1": 2094, "x2": 3812, "y2": 2274 }, { "x1": 3649, "y1": 2256, "x2": 3703, "y2": 2303 } ], - "go": { "x": 3714, "y": 2220, "z": 20 } + "GoLocation": { "x": 3714, "y": 2220, "z": 20 } }, { - "type": "BaseRegion", - "map": "Trammel", - "parent": "Magincia", - "logoutDelay": false, - "rects": [{ "x1": 3687, "y1": 2246, "x2": 3699, "y2": 2262 }] + "$type": "BaseRegion", + "Map": "Trammel", + "Parent": "Magincia", + "LogoutDelay": false, + "Area": [{ "x1": 3687, "y1": 2246, "x2": 3699, "y2": 2262 }] }, { - "name": "Buccaneer's Den", - "type": "TownRegion", - "map": "Trammel", - "priority": 50, - "music": "BucsDen", - "guardsDisabled": true, - "rects": [ + "$type": "TownRegion", + "Name": "Buccaneer's Den", + "Map": "Trammel", + "Priority": 50, + "Music": "BucsDen", + "GuardsDisabled": true, + "Area": [ { "x1": 2612, "y1": 2057, "x2": 2776, "y2": 2267 }, { "x1": 2604, "y1": 2065, "z1": 0, "x2": 2612, "y2": 2254, "z2": 128 } ], - "go": { "x": 2706, "y": 2163, "z": 0 } + "GoLocation": { "x": 2706, "y": 2163, "z": 0 } }, { - "type": "BaseRegion", - "map": "Trammel", - "parent": "Buccaneer's Den", - "logoutDelay": false, - "rects": [ + "$type": "BaseRegion", + "Map": "Trammel", + "Parent": "Buccaneer's Den", + "LogoutDelay": false, + "Area": [ { "x1": 2712, "y1": 2080, "x2": 2728, "y2": 2096 }, { "x1": 2712, "y1": 2096, "x2": 2720, "y2": 2104 }, { "x1": 2664, "y1": 2232, "x2": 2688, "y2": 2240 }, @@ -1898,1022 +1898,1022 @@ ] }, { - "name": "Covetous", - "type": "DungeonRegion", - "map": "Trammel", - "priority": 50, - "music": "Dungeon9", - "rects": [ + "$type": "DungeonRegion", + "Name": "Covetous", + "Map": "Trammel", + "Priority": 50, + "Music": "Dungeon9", + "Area": [ { "x1": 5376, "y1": 1793, "x2": 5577, "y2": 2048 }, { "x1": 5576, "y1": 1791, "x2": 5633, "y2": 2048 } ], - "go": { "x": 5456, "y": 1862, "z": 0 }, - "entrance": { "x": 2499, "y": 916 } + "GoLocation": { "x": 5456, "y": 1862, "z": 0 }, + "Entrance": { "x": 2499, "y": 916 } }, { - "name": "Deceit", - "type": "DungeonRegion", - "map": "Trammel", - "priority": 50, - "music": "Dungeon9", - "rects": [{ "x1": 5122, "y1": 518, "x2": 5370, "y2": 770 }], - "go": { "x": 5187, "y": 635, "z": 0 }, - "entrance": { "x": 4111, "y": 429 } + "$type": "DungeonRegion", + "Name": "Deceit", + "Map": "Trammel", + "Priority": 50, + "Music": "Dungeon9", + "Area": [{ "x1": 5122, "y1": 518, "x2": 5370, "y2": 770 }], + "GoLocation": { "x": 5187, "y": 635, "z": 0 }, + "Entrance": { "x": 4111, "y": 429 } }, { - "name": "Despise", - "type": "DungeonRegion", - "map": "Trammel", - "priority": 50, - "music": "Dungeon9", - "rects": [{ "x1": 5377, "y1": 516, "x2": 5631, "y2": 1022 }], - "go": { "x": 5501, "y": 570, "z": 59 }, - "entrance": { "x": 1296, "y": 1082 } + "$type": "DungeonRegion", + "Name": "Despise", + "Map": "Trammel", + "Priority": 50, + "Music": "Dungeon9", + "Area": [{ "x1": 5377, "y1": 516, "x2": 5631, "y2": 1022 }], + "GoLocation": { "x": 5501, "y": 570, "z": 59 }, + "Entrance": { "x": 1296, "y": 1082 } }, { - "name": "Destard", - "type": "DungeonRegion", - "map": "Trammel", - "priority": 50, - "music": "Dungeon9", - "rects": [{ "x1": 5120, "y1": 770, "x2": 5371, "y2": 1028 }], - "go": { "x": 5243, "y": 1004, "z": 0 }, - "entrance": { "x": 1176, "y": 2635 } + "$type": "DungeonRegion", + "Name": "Destard", + "Map": "Trammel", + "Priority": 50, + "Music": "Dungeon9", + "Area": [{ "x1": 5120, "y1": 770, "x2": 5371, "y2": 1028 }], + "GoLocation": { "x": 5243, "y": 1004, "z": 0 }, + "Entrance": { "x": 1176, "y": 2635 } }, { - "name": "Hythloth", - "type": "DungeonRegion", - "map": "Trammel", - "priority": 50, - "music": "Dungeon9", - "rects": [{ "x1": 5898, "y1": 2, "x2": 6136, "y2": 246 }], - "go": { "x": 5905, "y": 22, "z": 44 }, - "entrance": { "x": 4722, "y": 3814 } + "$type": "DungeonRegion", + "Name": "Hythloth", + "Map": "Trammel", + "Priority": 50, + "Music": "Dungeon9", + "Area": [{ "x1": 5898, "y1": 2, "x2": 6136, "y2": 246 }], + "GoLocation": { "x": 5905, "y": 22, "z": 44 }, + "Entrance": { "x": 4722, "y": 3814 } }, { - "name": "Jail", - "type": "JailRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 5271, "y1": 1159, "x2": 5312, "y2": 1192 }], - "go": { "x": 5275, "y": 1163, "z": 0 } + "$type": "JailRegion", + "Name": "Jail", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 5271, "y1": 1159, "x2": 5312, "y2": 1192 }], + "GoLocation": { "x": 5275, "y": 1163, "z": 0 } }, { - "name": "Green Acres", - "type": "GreenAcresRegion", - "map": "Trammel", - "priority": 1, - "rects": [{ "x1": 5376, "y1": 512, "x2": 6143, "y2": 1279 }], - "go": { "x": 5445, "y": 1153, "z": 0 } + "$type": "GreenAcresRegion", + "Name": "Green Acres", + "Map": "Trammel", + "Priority": 1, + "Area": [{ "x1": 5376, "y1": 512, "x2": 6143, "y2": 1279 }], + "GoLocation": { "x": 5445, "y": 1153, "z": 0 } }, { - "name": "Shame", - "type": "DungeonRegion", - "map": "Trammel", - "priority": 50, - "music": "Dungeon9", - "rects": [ + "$type": "DungeonRegion", + "Name": "Shame", + "Map": "Trammel", + "Priority": 50, + "Music": "Dungeon9", + "Area": [ { "x1": 5377, "y1": 2, "x2": 5634, "y2": 262 }, { "x1": 5635, "y1": 2, "x2": 5895, "y2": 126 } ], - "go": { "x": 5395, "y": 126, "z": 0 }, - "entrance": { "x": 512, "y": 1559 } + "GoLocation": { "x": 5395, "y": 126, "z": 0 }, + "Entrance": { "x": 512, "y": 1559 } }, { - "name": "Wrong", - "type": "DungeonRegion", - "map": "Trammel", - "priority": 50, - "music": "Dungeon9", - "rects": [{ "x1": 5633, "y1": 511, "x2": 5886, "y2": 1021 }], - "go": { "x": 5825, "y": 599, "z": 0 }, - "entrance": { "x": 2042, "y": 226 } + "$type": "DungeonRegion", + "Name": "Wrong", + "Map": "Trammel", + "Priority": 50, + "Music": "Dungeon9", + "Area": [{ "x1": 5633, "y1": 511, "x2": 5886, "y2": 1021 }], + "GoLocation": { "x": 5825, "y": 599, "z": 0 }, + "Entrance": { "x": 2042, "y": 226 } }, { - "name": "Cave 1", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [ + "$type": "BaseRegion", + "Name": "Cave 1", + "Map": "Trammel", + "Priority": 50, + "Area": [ { "x1": 2373, "y1": 900, "x2": 2395, "y2": 928 }, { "x1": 2395, "y1": 903, "x2": 2409, "y2": 919 }, { "x1": 2373, "y1": 928, "x2": 2383, "y2": 937 }, { "x1": 2359, "y1": 927, "x2": 2373, "y2": 945 } ], - "go": { "x": 2367, "y": 942, "z": 0 } + "GoLocation": { "x": 2367, "y": 942, "z": 0 } }, { - "name": "Cave 2", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 1887, "y1": 354, "x2": 1920, "y2": 377 }], - "go": { "x": 1903, "y": 365, "z": 0 } + "$type": "BaseRegion", + "Name": "Cave 2", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 1887, "y1": 354, "x2": 1920, "y2": 377 }], + "GoLocation": { "x": 1903, "y": 365, "z": 0 } }, { - "name": "Cave 3", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 1925, "y1": 307, "x2": 1943, "y2": 325 }], - "go": { "x": 1934, "y": 316, "z": 0 } + "$type": "BaseRegion", + "Name": "Cave 3", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 1925, "y1": 307, "x2": 1943, "y2": 325 }], + "GoLocation": { "x": 1934, "y": 316, "z": 0 } }, { - "name": "Cave 4", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 2323, "y1": 809, "x2": 2368, "y2": 851 }], - "go": { "x": 2345, "y": 830, "z": 0 } + "$type": "BaseRegion", + "Name": "Cave 4", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 2323, "y1": 809, "x2": 2368, "y2": 851 }], + "GoLocation": { "x": 2345, "y": 830, "z": 0 } }, { - "name": "Britain Mine 1", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 1436, "y1": 1215, "x2": 1465, "y2": 1252 }], - "go": { "x": 1443, "y": 1228, "z": 0 } + "$type": "BaseRegion", + "Name": "Britain Mine 1", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 1436, "y1": 1215, "x2": 1465, "y2": 1252 }], + "GoLocation": { "x": 1443, "y": 1228, "z": 0 } }, { - "name": "Britain Mine 2", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 1611, "y1": 1175, "x2": 1662, "y2": 1204 }], - "go": { "x": 1629, "y": 1189, "z": 0 } + "$type": "BaseRegion", + "Name": "Britain Mine 2", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 1611, "y1": 1175, "x2": 1662, "y2": 1204 }], + "GoLocation": { "x": 1629, "y": 1189, "z": 0 } }, { - "name": "Minoc Cave 1", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 2406, "y1": 168, "x2": 2428, "y2": 184 }], - "go": { "x": 2426, "y": 177, "z": 0 } + "$type": "BaseRegion", + "Name": "Minoc Cave 1", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 2406, "y1": 168, "x2": 2428, "y2": 184 }], + "GoLocation": { "x": 2426, "y": 177, "z": 0 } }, { - "name": "Minoc Cave 2", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 2418, "y1": 81, "x2": 2442, "y2": 113 }], - "go": { "x": 2440, "y": 94, "z": 0 } + "$type": "BaseRegion", + "Name": "Minoc Cave 2", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 2418, "y1": 81, "x2": 2442, "y2": 113 }], + "GoLocation": { "x": 2440, "y": 94, "z": 0 } }, { - "name": "Minoc Cave 3", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 2447, "y1": 39, "x2": 2489, "y2": 67 }], - "go": { "x": 2471, "y": 64, "z": 0 } + "$type": "BaseRegion", + "Name": "Minoc Cave 3", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 2447, "y1": 39, "x2": 2489, "y2": 67 }], + "GoLocation": { "x": 2471, "y": 64, "z": 0 } }, { - "name": "Minoc Mine", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [ + "$type": "BaseRegion", + "Name": "Minoc Mine", + "Map": "Trammel", + "Priority": 50, + "Area": [ { "x1": 2556, "y1": 501, "x2": 2562, "y2": 504 }, { "x1": 2556, "y1": 474, "x2": 2582, "y2": 501 } ], - "go": { "x": 2558, "y": 499, "z": 0 } + "GoLocation": { "x": 2558, "y": 499, "z": 0 } }, { - "name": "Avatar Isle Cave", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 4594, "y1": 3807, "x2": 4617, "y2": 3824 }], - "go": { "x": 4605, "y": 3815, "z": 0 } + "$type": "BaseRegion", + "Name": "Avatar Isle Cave", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 4594, "y1": 3807, "x2": 4617, "y2": 3824 }], + "GoLocation": { "x": 4605, "y": 3815, "z": 0 } }, { - "name": "Ice Isle Cave 1", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 4018, "y1": 421, "x2": 4067, "y2": 470 }], - "go": { "x": 4054, "y": 440, "z": 3 } + "$type": "BaseRegion", + "Name": "Ice Isle Cave 1", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 4018, "y1": 421, "x2": 4067, "y2": 470 }], + "GoLocation": { "x": 4054, "y": 440, "z": 3 } }, { - "name": "Ice Isle Cave 2", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [ + "$type": "BaseRegion", + "Name": "Ice Isle Cave 2", + "Map": "Trammel", + "Priority": 50, + "Area": [ { "x1": 4002, "y1": 310, "x2": 4045, "y2": 351 }, { "x1": 4005, "y1": 298, "x2": 4027, "y2": 310 } ], - "go": { "x": 4030, "y": 325, "z": 0 } + "GoLocation": { "x": 4030, "y": 325, "z": 0 } }, { - "name": "North Territory Cave", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 1973, "y1": 251, "x2": 1994, "y2": 274 }], - "go": { "x": 1984, "y": 262, "z": 8 } + "$type": "BaseRegion", + "Name": "North Territory Cave", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 1973, "y1": 251, "x2": 1994, "y2": 274 }], + "GoLocation": { "x": 1984, "y": 262, "z": 8 } }, { - "name": "Yew Cave", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 766, "y1": 1683, "x2": 778, "y2": 1697 }], - "go": { "x": 773, "y": 1684, "z": 0 } + "$type": "BaseRegion", + "Name": "Yew Cave", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 766, "y1": 1683, "x2": 778, "y2": 1697 }], + "GoLocation": { "x": 773, "y": 1684, "z": 0 } }, { - "name": "North Territory Mine 1", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 1713, "y1": 1055, "x2": 1753, "y2": 1080 }], - "go": { "x": 1723, "y": 1065, "z": 0 } + "$type": "BaseRegion", + "Name": "North Territory Mine 1", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 1713, "y1": 1055, "x2": 1753, "y2": 1080 }], + "GoLocation": { "x": 1723, "y": 1065, "z": 0 } }, { - "name": "North Territory Mine 2", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 1604, "y1": 958, "x2": 1650, "y2": 1009 }], - "go": { "x": 1638, "y": 974, "z": 0 } + "$type": "BaseRegion", + "Name": "North Territory Mine 2", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 1604, "y1": 958, "x2": 1650, "y2": 1009 }], + "GoLocation": { "x": 1638, "y": 974, "z": 0 } }, { - "name": "Mt Kendall", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [ + "$type": "BaseRegion", + "Name": "Mt Kendall", + "Map": "Trammel", + "Priority": 50, + "Area": [ { "x1": 2552, "y1": 448, "x2": 2623, "y2": 507 }, { "x1": 2547, "y1": 380, "x2": 2590, "y2": 448 }, { "x1": 2590, "y1": 413, "x2": 2623, "y2": 448 } ], - "go": { "x": 2593, "y": 477, "z": 60 } + "GoLocation": { "x": 2593, "y": 477, "z": 60 } }, { - "name": "Covetous Mine", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [ + "$type": "BaseRegion", + "Name": "Covetous Mine", + "Map": "Trammel", + "Priority": 50, + "Area": [ { "x1": 2429, "y1": 866, "x2": 2448, "y2": 911 }, { "x1": 2448, "y1": 879, "x2": 2475, "y2": 907 }, { "x1": 2456, "y1": 907, "x2": 2475, "y2": 941 } ], - "go": { "x": 2445, "y": 880, "z": 0 } + "GoLocation": { "x": 2445, "y": 880, "z": 0 } }, { - "name": "Terathan Keep", - "type": "DungeonRegion", - "map": "Trammel", - "priority": 50, - "music": "Dungeon9", - "rects": [ + "$type": "DungeonRegion", + "Name": "Terathan Keep", + "Map": "Trammel", + "Priority": 50, + "Music": "Dungeon9", + "Area": [ { "x1": 5404, "y1": 3099, "x2": 5481, "y2": 3167 }, { "x1": 5120, "y1": 1530, "x2": 5374, "y2": 1788 } ], - "go": { "x": 5451, "y": 3143, "z": -60 }, - "entrance": { "x": 5426, "y": 3120 } + "GoLocation": { "x": 5451, "y": 3143, "z": -60 }, + "Entrance": { "x": 5426, "y": 3120 } }, { - "name": "Fire", - "type": "DungeonRegion", - "map": "Trammel", - "priority": 50, - "music": "Dungeon9", - "rects": [{ "x1": 5635, "y1": 1285, "x2": 5880, "y2": 1520 }], - "go": { "x": 5760, "y": 2908, "z": 15 }, - "entrance": { "x": 2922, "y": 3402 } + "$type": "DungeonRegion", + "Name": "Fire", + "Map": "Trammel", + "Priority": 50, + "Music": "Dungeon9", + "Area": [{ "x1": 5635, "y1": 1285, "x2": 5880, "y2": 1520 }], + "GoLocation": { "x": 5760, "y": 2908, "z": 15 }, + "Entrance": { "x": 2922, "y": 3402 } }, { - "name": "Ice", - "type": "DungeonRegion", - "map": "Trammel", - "priority": 50, - "music": "Dungeon9", - "rects": [ + "$type": "DungeonRegion", + "Name": "Ice", + "Map": "Trammel", + "Priority": 50, + "Music": "Dungeon9", + "Area": [ { "x1": 5668, "y1": 130, "x2": 5888, "y2": 268 }, { "x1": 5800, "y1": 319, "x2": 5863, "y2": 384 }, { "x1": 5654, "y1": 300, "x2": 5708, "y2": 340 } ], - "go": { "x": 5210, "y": 2322, "z": 30 }, - "entrance": { "x": 1996, "y": 80 } + "GoLocation": { "x": 5210, "y": 2322, "z": 30 }, + "Entrance": { "x": 1996, "y": 80 } }, { - "name": "Delucia", - "type": "TownRegion", - "map": "Trammel", - "priority": 50, - "rects": [ + "$type": "TownRegion", + "Name": "Delucia", + "Map": "Trammel", + "Priority": 50, + "Area": [ { "x1": 5123, "y1": 3942, "x2": 5315, "y2": 4064 }, { "x1": 5147, "y1": 4064, "x2": 5272, "y2": 4084 }, { "x1": 5235, "y1": 3930, "x2": 5315, "y2": 3942 } ], - "go": { "x": 5228, "y": 3978, "z": 37 } + "GoLocation": { "x": 5228, "y": 3978, "z": 37 } }, { - "type": "BaseRegion", - "map": "Trammel", - "parent": "Delucia", - "logoutDelay": false, - "rects": [{ "x1": 5194, "y1": 4053, "x2": 5204, "y2": 4073 }] + "$type": "BaseRegion", + "Map": "Trammel", + "Parent": "Delucia", + "LogoutDelay": false, + "Area": [{ "x1": 5194, "y1": 4053, "x2": 5204, "y2": 4073 }] }, { - "name": "Papua", - "type": "TownRegion", - "map": "Trammel", - "priority": 50, - "rects": [ + "$type": "TownRegion", + "Name": "Papua", + "Map": "Trammel", + "Priority": 50, + "Area": [ { "x1": 5639, "y1": 3095, "x2": 5831, "y2": 3318 }, { "x1": 5831, "y1": 3237, "x2": 5851, "y2": 3267 } ], - "go": { "x": 5769, "y": 3176, "z": 0 } + "GoLocation": { "x": 5769, "y": 3176, "z": 0 } }, { - "type": "BaseRegion", - "map": "Trammel", - "parent": "Papua", - "logoutDelay": false, - "rects": [{ "x1": 5757, "y1": 3150, "x2": 5781, "y2": 3174 }] + "$type": "BaseRegion", + "Map": "Trammel", + "Parent": "Papua", + "LogoutDelay": false, + "Area": [{ "x1": 5757, "y1": 3150, "x2": 5781, "y2": 3174 }] }, { - "name": "Wrong Entrance", - "type": "NoHousingRegion", - "map": "Trammel", - "priority": 50, - "music": "Mountn_a", - "rects": [{ "x1": 1939, "y1": 215, "x2": 2073, "y2": 352 }], - "go": { "x": 2043, "y": 236, "z": 13 } + "$type": "NoHousingRegion", + "Name": "Wrong Entrance", + "Map": "Trammel", + "Priority": 50, + "Music": "Mountn_a", + "Area": [{ "x1": 1939, "y1": 215, "x2": 2073, "y2": 352 }], + "GoLocation": { "x": 2043, "y": 236, "z": 13 } }, { - "name": "Covetous Entrance", - "type": "NoHousingRegion", - "map": "Trammel", - "priority": 50, - "music": "Vesper", - "rects": [{ "x1": 2433, "y1": 846, "x2": 2561, "y2": 974 }], - "go": { "x": 2499, "y": 918, "z": 0 } + "$type": "NoHousingRegion", + "Name": "Covetous Entrance", + "Map": "Trammel", + "Priority": 50, + "Music": "Vesper", + "Area": [{ "x1": 2433, "y1": 846, "x2": 2561, "y2": 974 }], + "GoLocation": { "x": 2499, "y": 918, "z": 0 } }, { - "name": "Despise Entrance", - "type": "NoHousingRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 1289, "y1": 1064, "x2": 1321, "y2": 1101 }], - "go": { "x": 1298, "y": 1081, "z": 0 } + "$type": "NoHousingRegion", + "Name": "Despise Entrance", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 1289, "y1": 1064, "x2": 1321, "y2": 1101 }], + "GoLocation": { "x": 1298, "y": 1081, "z": 0 } }, { - "name": "Despise Passage", - "type": "NoHousingRegion", - "map": "Trammel", - "priority": 50, - "rects": [ + "$type": "NoHousingRegion", + "Name": "Despise Passage", + "Map": "Trammel", + "Priority": 50, + "Area": [ { "x1": 1338, "y1": 1060, "x2": 1389, "y2": 1122 }, { "x1": 1354, "y1": 1122, "x2": 1396, "y2": 1243 }, { "x1": 1349, "y1": 1122, "x2": 1354, "y2": 1224 } ], - "go": { "x": 1380, "y": 1114, "z": 0 } + "GoLocation": { "x": 1380, "y": 1114, "z": 0 } }, { - "name": "Misc Dungeons", - "type": "DungeonRegion", - "map": "Trammel", - "priority": 50, - "music": "Dungeon9", - "rects": [{ "x1": 5886, "y1": 1281, "x2": 6143, "y2": 1535 }], - "go": { "x": 6032, "y": 1499, "z": 0 }, - "entrance": { "x": 1492, "y": 1641 } + "$type": "DungeonRegion", + "Name": "Misc Dungeons", + "Map": "Trammel", + "Priority": 50, + "Music": "Dungeon9", + "Area": [{ "x1": 5886, "y1": 1281, "x2": 6143, "y2": 1535 }], + "GoLocation": { "x": 6032, "y": 1499, "z": 0 }, + "Entrance": { "x": 1492, "y": 1641 } }, { - "name": "Orc Cave", - "type": "DungeonRegion", - "map": "Trammel", - "priority": 50, - "music": "Dungeon9", - "rects": [ + "$type": "DungeonRegion", + "Name": "Orc Cave", + "Map": "Trammel", + "Priority": 50, + "Music": "Dungeon9", + "Area": [ { "x1": 5281, "y1": 1283, "x2": 5373, "y2": 1386 }, { "x1": 5267, "y1": 1955, "x2": 5364, "y2": 2046 }, { "x1": 5127, "y1": 1941, "x2": 5164, "y2": 2024 } ], - "go": { "x": 5137, "y": 2015, "z": 0 }, - "entrance": { "x": 1014, "y": 1434 } + "GoLocation": { "x": 5137, "y": 2015, "z": 0 }, + "Entrance": { "x": 1014, "y": 1434 } }, { - "name": "A Cotton Field in Moonglow", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, + "$type": "BaseRegion", + "Name": "A Cotton Field in Moonglow", + "Map": "Trammel", + "Priority": 50, "rune": "A Cotton Field in Moonglow", - "rects": [{ "x1": 4557, "y1": 1471, "x2": 4577, "y2": 1481 }], - "go": { "x": 4567, "y": 1475, "z": 0 } + "Area": [{ "x1": 4557, "y1": 1471, "x2": 4577, "y2": 1481 }], + "GoLocation": { "x": 4567, "y": 1475, "z": 0 } }, { - "name": "A Wheatfield in Skara Brae 1", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, + "$type": "BaseRegion", + "Name": "A Wheatfield in Skara Brae 1", + "Map": "Trammel", + "Priority": 50, "rune": "A Wheatfield in Skara Brae", - "rects": [{ "x1": 796, "y1": 2152, "x2": 832, "y2": 2176 }], - "go": { "x": 813, "y": 2163, "z": 0 } + "Area": [{ "x1": 796, "y1": 2152, "x2": 832, "y2": 2176 }], + "GoLocation": { "x": 813, "y": 2163, "z": 0 } }, { - "name": "A Carrot Field in Skara Brae", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 816, "y1": 2251, "x2": 832, "y2": 2259 }], - "go": { "x": 823, "y": 2254, "z": 0 } + "$type": "BaseRegion", + "Name": "A Carrot Field in Skara Brae", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 816, "y1": 2251, "x2": 832, "y2": 2259 }], + "GoLocation": { "x": 823, "y": 2254, "z": 0 } }, { - "name": "An Onion Field in Skara Brae", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 816, "y1": 2261, "x2": 832, "y2": 2269 }], - "go": { "x": 823, "y": 2264, "z": 0 } + "$type": "BaseRegion", + "Name": "An Onion Field in Skara Brae", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 816, "y1": 2261, "x2": 832, "y2": 2269 }], + "GoLocation": { "x": 823, "y": 2264, "z": 0 } }, { - "name": "A Cabbage Field in Skara Brae 1", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 816, "y1": 2271, "x2": 832, "y2": 2279 }], - "go": { "x": 823, "y": 2264, "z": 0 } + "$type": "BaseRegion", + "Name": "A Cabbage Field in Skara Brae 1", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 816, "y1": 2271, "x2": 832, "y2": 2279 }], + "GoLocation": { "x": 823, "y": 2264, "z": 0 } }, { - "name": "A Cabbage Field in Skara Brae 2", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 816, "y1": 2281, "x2": 832, "y2": 2289 }], - "go": { "x": 823, "y": 2274, "z": 0 } + "$type": "BaseRegion", + "Name": "A Cabbage Field in Skara Brae 2", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 816, "y1": 2281, "x2": 832, "y2": 2289 }], + "GoLocation": { "x": 823, "y": 2274, "z": 0 } }, { - "name": "A Wheatfield in Skara Brae 2", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 835, "y1": 2344, "x2": 851, "y2": 2360 }], - "go": { "x": 843, "y": 2352, "z": 0 } + "$type": "BaseRegion", + "Name": "A Wheatfield in Skara Brae 2", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 835, "y1": 2344, "x2": 851, "y2": 2360 }], + "GoLocation": { "x": 843, "y": 2352, "z": 0 } }, { - "name": "A Cotton Field in Skara Brae", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 816, "y1": 2344, "x2": 832, "y2": 2368 }], - "go": { "x": 823, "y": 2355, "z": 0 } + "$type": "BaseRegion", + "Name": "A Cotton Field in Skara Brae", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 816, "y1": 2344, "x2": 832, "y2": 2368 }], + "GoLocation": { "x": 823, "y": 2355, "z": 0 } }, { - "name": "FireIsleCasino", - "type": "NoHousingRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 4038, "y1": 3303, "x2": 4098, "y2": 3367 }], - "go": { "x": 4047, "y": 3371, "z": 0 } + "$type": "NoHousingRegion", + "Name": "FireIsleCasino", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 4038, "y1": 3303, "x2": 4098, "y2": 3367 }], + "GoLocation": { "x": 4047, "y": 3371, "z": 0 } }, { - "name": "Shrine of Compassion", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 1851, "y1": 867, "x2": 1865, "y2": 881 }], - "go": { "x": 1856, "y": 872, "z": -1 } + "$type": "BaseRegion", + "Name": "Shrine of Compassion", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 1851, "y1": 867, "x2": 1865, "y2": 881 }], + "GoLocation": { "x": 1856, "y": 872, "z": -1 } }, { - "name": "Chaos Shrine", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 1456, "y1": 840, "x2": 1460, "y2": 847 }], - "go": { "x": 1456, "y": 854, "z": 0 } + "$type": "BaseRegion", + "Name": "Chaos Shrine", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 1456, "y1": 840, "x2": 1460, "y2": 847 }], + "GoLocation": { "x": 1456, "y": 854, "z": 0 } }, { - "name": "Shrine of Honesty", - "type": "BaseRegion", - "map": "Trammel", - "priority": 37, - "rects": [{ "x1": 4209, "y1": 560, "x2": 4216, "y2": 568 }], - "go": { "x": 4217, "y": 564, "z": 36 } + "$type": "BaseRegion", + "Name": "Shrine of Honesty", + "Map": "Trammel", + "Priority": 37, + "Area": [{ "x1": 4209, "y1": 560, "x2": 4216, "y2": 568 }], + "GoLocation": { "x": 4217, "y": 564, "z": 36 } }, { - "name": "Shrine of Honor", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 1721, "y1": 3525, "x2": 1729, "y2": 3531 }], - "go": { "x": 1730, "y": 3528, "z": 3 } + "$type": "BaseRegion", + "Name": "Shrine of Honor", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 1721, "y1": 3525, "x2": 1729, "y2": 3531 }], + "GoLocation": { "x": 1730, "y": 3528, "z": 3 } }, { - "name": "Shrine of Humility", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 4270, "y1": 3694, "x2": 4279, "y2": 3703 }], - "go": { "x": 4276, "y": 3699, "z": 0 } + "$type": "BaseRegion", + "Name": "Shrine of Humility", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 4270, "y1": 3694, "x2": 4279, "y2": 3703 }], + "GoLocation": { "x": 4276, "y": 3699, "z": 0 } }, { - "name": "Shrine of Justice", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 1297, "y1": 629, "x2": 1306, "y2": 638 }], - "go": { "x": 1301, "y": 639, "z": 16 } + "$type": "BaseRegion", + "Name": "Shrine of Justice", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 1297, "y1": 629, "x2": 1306, "y2": 638 }], + "GoLocation": { "x": 1301, "y": 639, "z": 16 } }, { - "name": "Shrine of Sacrifice", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 3352, "y1": 286, "x2": 3358, "y2": 293 }], - "go": { "x": 3355, "y": 299, "z": 9 } + "$type": "BaseRegion", + "Name": "Shrine of Sacrifice", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 3352, "y1": 286, "x2": 3358, "y2": 293 }], + "GoLocation": { "x": 3355, "y": 299, "z": 9 } }, { - "name": "Shrine of Spirituality", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [ + "$type": "BaseRegion", + "Name": "Shrine of Spirituality", + "Map": "Trammel", + "Priority": 50, + "Area": [ { "x1": 1590, "y1": 2485, "x2": 1600, "y2": 2496 }, { "x1": 1599, "y1": 2488, "x2": 1609, "y2": 2493 } ], - "go": { "x": 1589, "y": 2485, "z": 5 } + "GoLocation": { "x": 1589, "y": 2485, "z": 5 } }, { - "name": "Shrine of Valor", - "type": "BaseRegion", - "map": "Trammel", - "priority": 37, - "rects": [{ "x1": 2488, "y1": 3928, "x2": 2497, "y2": 3939 }], - "go": { "x": 2496, "y": 3932, "z": 0 } + "$type": "BaseRegion", + "Name": "Shrine of Valor", + "Map": "Trammel", + "Priority": 37, + "Area": [{ "x1": 2488, "y1": 3928, "x2": 2497, "y2": 3939 }], + "GoLocation": { "x": 2496, "y": 3932, "z": 0 } }, { - "name": "South Britannian Sea", - "type": "BaseRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 688, "y1": 3700, "x2": 2100, "y2": 4080 }] + "$type": "BaseRegion", + "Name": "South Britannian Sea", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 688, "y1": 3700, "x2": 2100, "y2": 4080 }] }, { - "name": "Paroxysmus Exit", - "type": "MondainRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 5620, "y1": 3032, "x2": 5630, "y2": 3042 }], - "go": { "x": 5623, "y": 3038, "z": 15 } + "$type": "MondainRegion", + "Name": "Paroxysmus Exit", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 5620, "y1": 3032, "x2": 5630, "y2": 3042 }], + "GoLocation": { "x": 5623, "y": 3038, "z": 15 } }, { - "name": "Sanctuary Entrance", - "type": "MondainRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 759, "y1": 1635, "x2": 771, "y2": 1647 }], - "go": { "x": 762, "y": 1645, "z": 0 } + "$type": "MondainRegion", + "Name": "Sanctuary Entrance", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 759, "y1": 1635, "x2": 771, "y2": 1647 }], + "GoLocation": { "x": 762, "y": 1645, "z": 0 } }, { - "name": "Solen Hives", - "type": "DungeonRegion", - "map": "Trammel", - "priority": 50, - "rects": [{ "x1": 5640, "y1": 1776, "x2": 5935, "y2": 2039 }], - "go": { "x": 5774, "y": 1896, "z": 20 } + "$type": "DungeonRegion", + "Name": "Solen Hives", + "Map": "Trammel", + "Priority": 50, + "Area": [{ "x1": 5640, "y1": 1776, "x2": 5935, "y2": 2039 }], + "GoLocation": { "x": 5774, "y": 1896, "z": 20 } }, { - "name": "Twisted Weald", - "type": "MondainRegion", - "map": "Ilshenar", - "priority": 50, - "music": "DreadHornArea", - "rects": [{ "x1": 2107, "y1": 1145, "x2": 2254, "y2": 1280 }], - "go": { "x": 2189, "y": 1253, "z": 0 }, - "entrance": { "x": 1450, "y": 1473 } + "$type": "MondainRegion", + "Name": "Twisted Weald", + "Map": "Ilshenar", + "Priority": 50, + "Music": "DreadHornArea", + "Area": [{ "x1": 2107, "y1": 1145, "x2": 2254, "y2": 1280 }], + "GoLocation": { "x": 2189, "y": 1253, "z": 0 }, + "Entrance": { "x": 1450, "y": 1473 } }, { - "name": "Twisted Weald Desert", - "type": "TwistedWealdDesertRegion", - "map": "Ilshenar", - "parent": "Twisted Weald", - "rects": [ + "$type": "TwistedWealdDesertRegion", + "Name": "Twisted Weald Desert", + "Map": "Ilshenar", + "Parent": "Twisted Weald", + "Area": [ { "x1": 2139, "y1": 1187, "x2": 2152, "y2": 1194 }, { "x1": 2152, "y1": 1164, "x2": 2190, "y2": 1194 }, { "x1": 2190, "y1": 1164, "x2": 2225, "y2": 1212 } ] }, { - "name": "Sheep Farm", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 50, - "rects": [{ "x1": 1303, "y1": 1312, "x2": 1333, "y2": 1342 }] + "$type": "BaseRegion", + "Name": "Sheep Farm", + "Map": "Ilshenar", + "Priority": 50, + "Area": [{ "x1": 1303, "y1": 1312, "x2": 1333, "y2": 1342 }] }, { - "name": "Shrine of Valor", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 37, - "rects": [{ "x1": 512, "y1": 200, "x2": 544, "y2": 232 }], - "go": { "x": 539, "y": 221, "z": -36 } + "$type": "BaseRegion", + "Name": "Shrine of Valor", + "Map": "Ilshenar", + "Priority": 37, + "Area": [{ "x1": 512, "y1": 200, "x2": 544, "y2": 232 }], + "GoLocation": { "x": 539, "y": 221, "z": -36 } }, { - "name": "Chaos Shrine", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 50, - "rects": [{ "x1": 1736, "y1": 224, "x2": 1760, "y2": 248 }], - "go": { "x": 1748, "y": 236, "z": 0 } + "$type": "BaseRegion", + "Name": "Chaos Shrine", + "Map": "Ilshenar", + "Priority": 50, + "Area": [{ "x1": 1736, "y1": 224, "x2": 1760, "y2": 248 }], + "GoLocation": { "x": 1748, "y": 236, "z": 0 } }, { - "name": "Shrine of Sacrifice", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 50, - "rects": [{ "x1": 1160, "y1": 1280, "x2": 1192, "y2": 1296 }], - "go": { "x": 1196, "y": 1290, "z": -25 } + "$type": "BaseRegion", + "Name": "Shrine of Sacrifice", + "Map": "Ilshenar", + "Priority": 50, + "Area": [{ "x1": 1160, "y1": 1280, "x2": 1192, "y2": 1296 }], + "GoLocation": { "x": 1196, "y": 1290, "z": -25 } }, { - "name": "Shrine of Honesty", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 37, - "rects": [{ "x1": 712, "y1": 1344, "x2": 736, "y2": 1376 }], - "go": { "x": 725, "y": 1355, "z": -61 } + "$type": "BaseRegion", + "Name": "Shrine of Honesty", + "Map": "Ilshenar", + "Priority": 37, + "Area": [{ "x1": 712, "y1": 1344, "x2": 736, "y2": 1376 }], + "GoLocation": { "x": 725, "y": 1355, "z": -61 } }, { - "name": "Shrine of Compassion", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 50, - "rects": [{ "x1": 1200, "y1": 448, "x2": 1232, "y2": 488 }], - "go": { "x": 1223, "y": 475, "z": -16 } + "$type": "BaseRegion", + "Name": "Shrine of Compassion", + "Map": "Ilshenar", + "Priority": 50, + "Area": [{ "x1": 1200, "y1": 448, "x2": 1232, "y2": 488 }], + "GoLocation": { "x": 1223, "y": 475, "z": -16 } }, { - "name": "Shrine of Spirituality", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 50, - "rects": [{ "x1": 1520, "y1": 1336, "x2": 1536, "y2": 1352 }], - "go": { "x": 1528, "y": 1344, "z": 0 } + "$type": "BaseRegion", + "Name": "Shrine of Spirituality", + "Map": "Ilshenar", + "Priority": 50, + "Area": [{ "x1": 1520, "y1": 1336, "x2": 1536, "y2": 1352 }], + "GoLocation": { "x": 1528, "y": 1344, "z": 0 } }, { - "name": "Shrine of Humility", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 50, - "rects": [{ "x1": 272, "y1": 1008, "x2": 296, "y2": 1024 }], - "go": { "x": 284, "y": 1016, "z": 0 } + "$type": "BaseRegion", + "Name": "Shrine of Humility", + "Map": "Ilshenar", + "Priority": 50, + "Area": [{ "x1": 272, "y1": 1008, "x2": 296, "y2": 1024 }], + "GoLocation": { "x": 284, "y": 1016, "z": 0 } }, { - "name": "Shrine of Honor", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 50, - "rects": [{ "x1": 736, "y1": 712, "x2": 760, "y2": 744 }], - "go": { "x": 748, "y": 728, "z": 0 } + "$type": "BaseRegion", + "Name": "Shrine of Honor", + "Map": "Ilshenar", + "Priority": 50, + "Area": [{ "x1": 736, "y1": 712, "x2": 760, "y2": 744 }], + "GoLocation": { "x": 748, "y": 728, "z": 0 } }, { - "name": "Terort Skitas", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 11, - "rects": [{ "x1": 528, "y1": 376, "x2": 624, "y2": 464 }], - "go": { "x": 568, "y": 430, "z": 41 } + "$type": "BaseRegion", + "Name": "Terort Skitas", + "Map": "Ilshenar", + "Priority": 11, + "Area": [{ "x1": 528, "y1": 376, "x2": 624, "y2": 464 }], + "GoLocation": { "x": 568, "y": 430, "z": 41 } }, { - "name": "Pormir Harm", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 50, - "music": "Stones2", - "rects": [{ "x1": 736, "y1": 480, "x2": 768, "y2": 504 }], - "go": { "x": 745, "y": 492, "z": -66 } + "$type": "BaseRegion", + "Name": "Pormir Harm", + "Map": "Ilshenar", + "Priority": 50, + "Music": "Stones2", + "Area": [{ "x1": 736, "y1": 480, "x2": 768, "y2": 504 }], + "GoLocation": { "x": 745, "y": 492, "z": -66 } }, { - "name": "Pormir Felwis", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 50, - "rects": [{ "x1": 472, "y1": 336, "x2": 512, "y2": 368 }], - "go": { "x": 472, "y": 352, "z": -78 } + "$type": "BaseRegion", + "Name": "Pormir Felwis", + "Map": "Ilshenar", + "Priority": 50, + "Area": [{ "x1": 472, "y1": 336, "x2": 512, "y2": 368 }], + "GoLocation": { "x": 472, "y": 352, "z": -78 } }, { - "name": "Cyclops Temple", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 50, - "rects": [{ "x1": 880, "y1": 1256, "x2": 936, "y2": 1368 }], - "go": { "x": 901, "y": 1297, "z": -71 } + "$type": "BaseRegion", + "Name": "Cyclops Temple", + "Map": "Ilshenar", + "Priority": 50, + "Area": [{ "x1": 880, "y1": 1256, "x2": 936, "y2": 1368 }], + "GoLocation": { "x": 901, "y": 1297, "z": -71 } }, { - "name": "Rat Fort", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 50, - "rects": [{ "x1": 616, "y1": 792, "x2": 672, "y2": 848 }], - "go": { "x": 642, "y": 845, "z": -58 } + "$type": "BaseRegion", + "Name": "Rat Fort", + "Map": "Ilshenar", + "Priority": 50, + "Area": [{ "x1": 616, "y1": 792, "x2": 672, "y2": 848 }], + "GoLocation": { "x": 642, "y": 845, "z": -58 } }, { - "name": "Rat Fort Cellar", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 50, - "rects": [{ "x1": 160, "y1": 736, "x2": 192, "y2": 768 }], - "go": { "x": 171, "y": 750, "z": -28 } + "$type": "BaseRegion", + "Name": "Rat Fort Cellar", + "Map": "Ilshenar", + "Priority": 50, + "Area": [{ "x1": 160, "y1": 736, "x2": 192, "y2": 768 }], + "GoLocation": { "x": 171, "y": 750, "z": -28 } }, { - "name": "Entrance to Central Ilshenar 1", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 50, - "rects": [{ "x1": 1136, "y1": 584, "x2": 1152, "y2": 600 }], - "go": { "x": 1141, "y": 594, "z": -80 } + "$type": "BaseRegion", + "Name": "Entrance to Central Ilshenar 1", + "Map": "Ilshenar", + "Priority": 50, + "Area": [{ "x1": 1136, "y1": 584, "x2": 1152, "y2": 600 }], + "GoLocation": { "x": 1141, "y": 594, "z": -80 } }, { - "name": "Entrance to Central Ilshenar 2", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 50, - "rects": [{ "x1": 1232, "y1": 576, "x2": 1240, "y2": 592 }], - "go": { "x": 1238, "y": 583, "z": -19 } + "$type": "BaseRegion", + "Name": "Entrance to Central Ilshenar 2", + "Map": "Ilshenar", + "Priority": 50, + "Area": [{ "x1": 1232, "y1": 576, "x2": 1240, "y2": 592 }], + "GoLocation": { "x": 1238, "y": 583, "z": -19 } }, { - "name": "Montor", - "type": "TownRegion", - "map": "Ilshenar", - "priority": 41, - "guardsDisabled": true, - "rects": [ + "$type": "TownRegion", + "Name": "Montor", + "Map": "Ilshenar", + "Priority": 41, + "GuardsDisabled": true, + "Area": [ { "x1": 1576, "y1": 272, "x2": 1720, "y2": 368 }, { "x1": 1616, "y1": 200, "x2": 1696, "y2": 272 }, { "x1": 1696, "y1": 144, "x2": 1736, "y2": 272 }, { "x1": 1736, "y1": 144, "x2": 1768, "y2": 208 } ], - "go": { "x": 1646, "y": 319, "z": 48 } + "GoLocation": { "x": 1646, "y": 319, "z": 48 } }, { - "name": "Termir Flam", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 40, - "rects": [ + "$type": "BaseRegion", + "Name": "Termir Flam", + "Map": "Ilshenar", + "Priority": 40, + "Area": [ { "x1": 1520, "y1": 368, "x2": 1752, "y2": 496 }, { "x1": 1520, "y1": 296, "x2": 1576, "y2": 368 }, { "x1": 1752, "y1": 440, "x2": 1776, "y2": 480 } ], - "go": { "x": 1636, "y": 432, "z": 0 } + "GoLocation": { "x": 1636, "y": 432, "z": 0 } }, { - "name": "Ancient Citadel", - "type": "TownRegion", - "map": "Ilshenar", - "priority": 11, - "guardsDisabled": true, - "rects": [{ "x1": 1448, "y1": 496, "x2": 1552, "y2": 600 }], - "go": { "x": 1516, "y": 542, "z": 85 } + "$type": "TownRegion", + "Name": "Ancient Citadel", + "Map": "Ilshenar", + "Priority": 11, + "GuardsDisabled": true, + "Area": [{ "x1": 1448, "y1": 496, "x2": 1552, "y2": 600 }], + "GoLocation": { "x": 1516, "y": 542, "z": 85 } }, { - "name": "Alexandretta's Bowl", - "type": "TownRegion", - "map": "Ilshenar", - "priority": 41, - "guardsDisabled": true, - "rects": [{ "x1": 1272, "y1": 352, "x2": 1440, "y2": 592 }], - "go": { "x": 1396, "y": 432, "z": -17 } + "$type": "TownRegion", + "Name": "Alexandretta's Bowl", + "Map": "Ilshenar", + "Priority": 41, + "GuardsDisabled": true, + "Area": [{ "x1": 1272, "y1": 352, "x2": 1440, "y2": 592 }], + "GoLocation": { "x": 1396, "y": 432, "z": -17 } }, { - "name": "Entrance to Rock Dungeon", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 2, - "rects": [{ "x1": 1784, "y1": 560, "x2": 1792, "y2": 576 }], - "go": { "x": 1784, "y": 568, "z": 100 } + "$type": "BaseRegion", + "Name": "Entrance to Rock Dungeon", + "Map": "Ilshenar", + "Priority": 2, + "Area": [{ "x1": 1784, "y1": 560, "x2": 1792, "y2": 576 }], + "GoLocation": { "x": 1784, "y": 568, "z": 100 } }, { - "name": "Rock Dungeon", - "type": "DungeonRegion", - "map": "Ilshenar", - "priority": 2, - "rects": [ + "$type": "DungeonRegion", + "Name": "Rock Dungeon", + "Map": "Ilshenar", + "Priority": 2, + "Area": [ { "x1": 2176, "y1": 288, "x2": 2200, "y2": 328 }, { "x1": 2088, "y1": 8, "x2": 2248, "y2": 184 } ], - "go": { "x": 2187, "y": 316, "z": -7 }, - "entrance": { "x": 1788, "y": 571 } + "GoLocation": { "x": 2187, "y": 316, "z": -7 }, + "Entrance": { "x": 1788, "y": 571 } }, { - "name": "Lenmir Anfinmotas", - "type": "TownRegion", - "map": "Ilshenar", - "priority": 5, - "guardsDisabled": true, - "rects": [{ "x1": 1560, "y1": 792, "x2": 1792, "y2": 912 }], - "go": { "x": 1673, "y": 876, "z": -25 } + "$type": "TownRegion", + "Name": "Lenmir Anfinmotas", + "Map": "Ilshenar", + "Priority": 5, + "GuardsDisabled": true, + "Area": [{ "x1": 1560, "y1": 792, "x2": 1792, "y2": 912 }], + "GoLocation": { "x": 1673, "y": 876, "z": -25 } }, { - "name": "Entrance to Spider Cave", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 2, - "rects": [{ "x1": 1400, "y1": 896, "x2": 1440, "y2": 920 }], - "go": { "x": 1418, "y": 915, "z": -19 } + "$type": "BaseRegion", + "Name": "Entrance to Spider Cave", + "Map": "Ilshenar", + "Priority": 2, + "Area": [{ "x1": 1400, "y1": 896, "x2": 1440, "y2": 920 }], + "GoLocation": { "x": 1418, "y": 915, "z": -19 } }, { - "name": "Spider Cave", - "type": "DungeonRegion", - "map": "Ilshenar", - "priority": 50, - "rects": [ + "$type": "DungeonRegion", + "Name": "Spider Cave", + "Map": "Ilshenar", + "Priority": 50, + "Area": [ { "x1": 1752, "y1": 952, "x2": 1864, "y2": 1000 }, { "x1": 1480, "y1": 864, "x2": 1528, "y2": 896 } ], - "go": { "x": 1785, "y": 991, "z": -28 }, - "entrance": { "x": 1420, "y": 910 } + "GoLocation": { "x": 1785, "y": 991, "z": -28 }, + "Entrance": { "x": 1420, "y": 910 } }, { - "name": "Twin Oaks", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 48, - "rects": [{ "x1": 1536, "y1": 1032, "x2": 1584, "y2": 1072 }], - "go": { "x": 1560, "y": 1052, "z": 0 } + "$type": "BaseRegion", + "Name": "Twin Oaks", + "Map": "Ilshenar", + "Priority": 48, + "Area": [{ "x1": 1536, "y1": 1032, "x2": 1584, "y2": 1072 }], + "GoLocation": { "x": 1560, "y": 1052, "z": 0 } }, { - "type": "BaseRegion", - "map": "Ilshenar", - "parent": "Twin Oaks", - "logoutDelay": false, - "rects": [{ "x1": 1546, "y1": 1037, "x2": 1567, "y2": 1057 }] + "$type": "BaseRegion", + "Map": "Ilshenar", + "Parent": "Twin Oaks", + "LogoutDelay": false, + "Area": [{ "x1": 1546, "y1": 1037, "x2": 1567, "y2": 1057 }] }, { - "name": "Reg Volon", - "type": "TownRegion", - "map": "Ilshenar", - "priority": 50, - "guardsDisabled": true, - "rects": [{ "x1": 1328, "y1": 1008, "x2": 1408, "y2": 1120 }], - "go": { "x": 1363, "y": 1055, "z": -13 } + "$type": "TownRegion", + "Name": "Reg Volon", + "Map": "Ilshenar", + "Priority": 50, + "GuardsDisabled": true, + "Area": [{ "x1": 1328, "y1": 1008, "x2": 1408, "y2": 1120 }], + "GoLocation": { "x": 1363, "y": 1055, "z": -13 } }, { - "name": "Entrance Spectre Dungeon", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 2, - "rects": [{ "x1": 1360, "y1": 1030, "x2": 1366, "y2": 1034 }], - "go": { "x": 1363, "y": 1033, "z": -8 } + "$type": "BaseRegion", + "Name": "Entrance Spectre Dungeon", + "Map": "Ilshenar", + "Priority": 2, + "Area": [{ "x1": 1360, "y1": 1030, "x2": 1366, "y2": 1034 }], + "GoLocation": { "x": 1363, "y": 1033, "z": -8 } }, { - "name": "Spectre Dungeon", - "type": "DungeonRegion", - "map": "Ilshenar", - "priority": 2, - "rects": [{ "x1": 1936, "y1": 1000, "x2": 2032, "y2": 1120 }], - "go": { "x": 1983, "y": 1107, "z": -18 }, - "entrance": { "x": 1362, "y": 1031 } + "$type": "DungeonRegion", + "Name": "Spectre Dungeon", + "Map": "Ilshenar", + "Priority": 2, + "Area": [{ "x1": 1936, "y1": 1000, "x2": 2032, "y2": 1120 }], + "GoLocation": { "x": 1983, "y": 1107, "z": -18 }, + "Entrance": { "x": 1362, "y": 1031 } }, { - "name": "Entrance Blood Dungeon", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 2, - "rects": [{ "x1": 1736, "y1": 1224, "x2": 1760, "y2": 1240 }], - "go": { "x": 1747, "y": 1227, "z": -1 } + "$type": "BaseRegion", + "Name": "Entrance Blood Dungeon", + "Map": "Ilshenar", + "Priority": 2, + "Area": [{ "x1": 1736, "y1": 1224, "x2": 1760, "y2": 1240 }], + "GoLocation": { "x": 1747, "y": 1227, "z": -1 } }, { - "name": "Blood Dungeon", - "type": "DungeonRegion", - "map": "Ilshenar", - "priority": 2, - "rects": [{ "x1": 2032, "y1": 808, "x2": 2200, "y2": 1064 }], - "go": { "x": 2114, "y": 839, "z": -28 }, - "entrance": { "x": 1745, "y": 1236 } + "$type": "DungeonRegion", + "Name": "Blood Dungeon", + "Map": "Ilshenar", + "Priority": 2, + "Area": [{ "x1": 2032, "y1": 808, "x2": 2200, "y2": 1064 }], + "GoLocation": { "x": 2114, "y": 839, "z": -28 }, + "Entrance": { "x": 1745, "y": 1236 } }, { - "name": "Entrance Mushroom Cave", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 2, - "rects": [{ "x1": 1448, "y1": 1320, "x2": 1464, "y2": 1336 }], - "go": { "x": 1460, "y": 1329, "z": -25 } + "$type": "BaseRegion", + "Name": "Entrance Mushroom Cave", + "Map": "Ilshenar", + "Priority": 2, + "Area": [{ "x1": 1448, "y1": 1320, "x2": 1464, "y2": 1336 }], + "GoLocation": { "x": 1460, "y": 1329, "z": -25 } }, { - "name": "Mushroom Cave", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 11, - "rects": [{ "x1": 1392, "y1": 1448, "x2": 1496, "y2": 1568 }], - "go": { "x": 1476, "y": 1494, "z": -28 } + "$type": "BaseRegion", + "Name": "Mushroom Cave", + "Map": "Ilshenar", + "Priority": 11, + "Area": [{ "x1": 1392, "y1": 1448, "x2": 1496, "y2": 1568 }], + "GoLocation": { "x": 1476, "y": 1494, "z": -28 } }, { - "name": "Lake Shire", - "type": "TownRegion", - "map": "Ilshenar", - "priority": 48, - "guardsDisabled": true, - "rects": [{ "x1": 1144, "y1": 1072, "x2": 1264, "y2": 1200 }], - "go": { "x": 1212, "y": 1144, "z": -25 } + "$type": "TownRegion", + "Name": "Lake Shire", + "Map": "Ilshenar", + "Priority": 48, + "GuardsDisabled": true, + "Area": [{ "x1": 1144, "y1": 1072, "x2": 1264, "y2": 1200 }], + "GoLocation": { "x": 1212, "y": 1144, "z": -25 } }, { - "name": "Entrance Rat Cave", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 2, - "rects": [{ "x1": 1024, "y1": 1152, "x2": 1032, "y2": 1160 }], - "go": { "x": 1031, "y": 1154, "z": -24 } + "$type": "BaseRegion", + "Name": "Entrance Rat Cave", + "Map": "Ilshenar", + "Priority": 2, + "Area": [{ "x1": 1024, "y1": 1152, "x2": 1032, "y2": 1160 }], + "GoLocation": { "x": 1031, "y": 1154, "z": -24 } }, { - "name": "Rat Cave Territory", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 2, - "rects": [{ "x1": 1144, "y1": 1440, "x2": 1368, "y2": 1584 }], - "go": { "x": 1345, "y": 1511, "z": -3 } + "$type": "BaseRegion", + "Name": "Rat Cave Territory", + "Map": "Ilshenar", + "Priority": 2, + "Area": [{ "x1": 1144, "y1": 1440, "x2": 1368, "y2": 1584 }], + "GoLocation": { "x": 1345, "y": 1511, "z": -3 } }, { - "name": "Ratman Cave", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 2, - "rects": [ + "$type": "BaseRegion", + "Name": "Ratman Cave", + "Map": "Ilshenar", + "Priority": 2, + "Area": [ { "x1": 1264, "y1": 1448, "x2": 1360, "y2": 1576 }, { "x1": 1152, "y1": 1456, "x2": 1256, "y2": 1560 } ], - "go": { "x": 1348, "y": 1511, "z": -3 } + "GoLocation": { "x": 1348, "y": 1511, "z": -3 } }, { - "name": "Bet-Lem Reg", - "type": "TownRegion", - "map": "Ilshenar", - "priority": 48, - "guardsDisabled": true, - "rects": [{ "x1": 1232, "y1": 936, "x2": 1272, "y2": 984 }], - "go": { "x": 1238, "y": 974, "z": -34 } + "$type": "TownRegion", + "Name": "Bet-Lem Reg", + "Map": "Ilshenar", + "Priority": 48, + "GuardsDisabled": true, + "Area": [{ "x1": 1232, "y1": 936, "x2": 1272, "y2": 984 }], + "GoLocation": { "x": 1238, "y": 974, "z": -34 } }, { - "name": "Mistas", - "type": "TownRegion", - "map": "Ilshenar", - "priority": 48, - "guardsDisabled": true, - "rects": [ + "$type": "TownRegion", + "Name": "Mistas", + "Map": "Ilshenar", + "Priority": 48, + "GuardsDisabled": true, + "Area": [ { "x1": 744, "y1": 984, "x2": 912, "y2": 1152 }, { "x1": 744, "y1": 1152, "x2": 792, "y2": 1176 } ], - "go": { "x": 818, "y": 1073, "z": -30 } + "GoLocation": { "x": 818, "y": 1073, "z": -30 } }, { - "type": "BaseRegion", - "map": "Ilshenar", - "parent": "Mistas", - "logoutDelay": false, - "rects": [{ "x1": 752, "y1": 1131, "x2": 768, "y2": 1152 }] + "$type": "BaseRegion", + "Map": "Ilshenar", + "Parent": "Mistas", + "LogoutDelay": false, + "Area": [{ "x1": 752, "y1": 1131, "x2": 768, "y2": 1152 }] }, { - "name": "Entrance Serpentine Passage", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 2, - "rects": [{ "x1": 800, "y1": 864, "x2": 816, "y2": 880 }], - "go": { "x": 808, "y": 872, "z": 5 } + "$type": "BaseRegion", + "Name": "Entrance Serpentine Passage", + "Map": "Ilshenar", + "Priority": 2, + "Area": [{ "x1": 800, "y1": 864, "x2": 816, "y2": 880 }], + "GoLocation": { "x": 808, "y": 872, "z": 5 } }, { - "name": "Serpentine Passage", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 11, - "rects": [{ "x1": 368, "y1": 1488, "x2": 560, "y2": 1592 }], - "go": { "x": 533, "y": 1526, "z": -25 } + "$type": "BaseRegion", + "Name": "Serpentine Passage", + "Map": "Ilshenar", + "Priority": 11, + "Area": [{ "x1": 368, "y1": 1488, "x2": 560, "y2": 1592 }], + "GoLocation": { "x": 533, "y": 1526, "z": -25 } }, { - "name": "Ankh Dungeon", - "type": "DungeonRegion", - "map": "Ilshenar", - "priority": 2, - "rects": [ + "$type": "DungeonRegion", + "Name": "Ankh Dungeon", + "Map": "Ilshenar", + "Priority": 2, + "Area": [ { "x1": 0, "y1": 1248, "x2": 176, "y2": 1592 }, { "x1": 568, "y1": 1152, "x2": 584, "y2": 1160 } ], - "go": { "x": 156, "y": 1484, "z": -28 }, - "entrance": { "x": 668, "y": 928 } + "GoLocation": { "x": 156, "y": 1484, "z": -28 }, + "Entrance": { "x": 668, "y": 928 } }, { - "name": "Kirin passage", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 11, - "rects": [{ "x1": 0, "y1": 800, "x2": 192, "y2": 1200 }], - "go": { "x": 11, "y": 881, "z": -29 } + "$type": "BaseRegion", + "Name": "Kirin passage", + "Map": "Ilshenar", + "Priority": 11, + "Area": [{ "x1": 0, "y1": 800, "x2": 192, "y2": 1200 }], + "GoLocation": { "x": 11, "y": 881, "z": -29 } }, { - "name": "Entrance Lizards Passage", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 2, - "rects": [{ "x1": 312, "y1": 1328, "x2": 320, "y2": 1336 }], - "go": { "x": 314, "y": 1331, "z": -37 } + "$type": "BaseRegion", + "Name": "Entrance Lizards Passage", + "Map": "Ilshenar", + "Priority": 2, + "Area": [{ "x1": 312, "y1": 1328, "x2": 320, "y2": 1336 }], + "GoLocation": { "x": 314, "y": 1331, "z": -37 } }, { - "name": "Wisp Dungeon", - "type": "DungeonRegion", - "map": "Ilshenar", - "priority": 2, - "rects": [ + "$type": "DungeonRegion", + "Name": "Wisp Dungeon", + "Map": "Ilshenar", + "Priority": 2, + "Area": [ { "x1": 616, "y1": 1480, "x2": 704, "y2": 1576 }, { "x1": 704, "y1": 1544, "x2": 728, "y2": 1576 }, { "x1": 704, "y1": 1480, "x2": 744, "y2": 1520 }, @@ -2924,173 +2924,173 @@ { "x1": 744, "y1": 1504, "x2": 816, "y2": 1584 }, { "x1": 744, "y1": 1456, "x2": 800, "y2": 1504 } ], - "go": { "x": 628, "y": 1524, "z": -28 }, - "entrance": { "x": 652, "y": 1301 } + "GoLocation": { "x": 628, "y": 1524, "z": -28 }, + "Entrance": { "x": 652, "y": 1301 } }, { - "name": "Lizard Passage", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 11, - "rects": [{ "x1": 256, "y1": 1560, "x2": 336, "y2": 1592 }], - "go": { "x": 285, "y": 1585, "z": -27 } + "$type": "BaseRegion", + "Name": "Lizard Passage", + "Map": "Ilshenar", + "Priority": 11, + "Area": [{ "x1": 256, "y1": 1560, "x2": 336, "y2": 1592 }], + "GoLocation": { "x": 285, "y": 1585, "z": -27 } }, { - "name": "Exodus Dungeon", - "type": "DungeonRegion", - "map": "Ilshenar", - "priority": 50, - "rects": [{ "x1": 1832, "y1": 16, "x2": 2080, "y2": 216 }], - "go": { "x": 1966, "y": 117, "z": -28 }, - "entrance": { "x": 827, "y": 777 } + "$type": "DungeonRegion", + "Name": "Exodus Dungeon", + "Map": "Ilshenar", + "Priority": 50, + "Area": [{ "x1": 1832, "y1": 16, "x2": 2080, "y2": 216 }], + "GoLocation": { "x": 1966, "y": 117, "z": -28 }, + "Entrance": { "x": 827, "y": 777 } }, { - "name": "Lizard Man's Huts", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 48, - "rects": [{ "x1": 264, "y1": 1280, "x2": 320, "y2": 1376 }], - "go": { "x": 298, "y": 1336, "z": -24 } + "$type": "BaseRegion", + "Name": "Lizard Man's Huts", + "Map": "Ilshenar", + "Priority": 48, + "Area": [{ "x1": 264, "y1": 1280, "x2": 320, "y2": 1376 }], + "GoLocation": { "x": 298, "y": 1336, "z": -24 } }, { - "name": "Nox Tereg", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 50, - "rects": [{ "x1": 344, "y1": 1112, "x2": 488, "y2": 1240 }], - "go": { "x": 416, "y": 1176, "z": 0 } + "$type": "BaseRegion", + "Name": "Nox Tereg", + "Map": "Ilshenar", + "Priority": 50, + "Area": [{ "x1": 344, "y1": 1112, "x2": 488, "y2": 1240 }], + "GoLocation": { "x": 416, "y": 1176, "z": 0 } }, { - "name": "Sorcerer's Dungeon", - "type": "DungeonRegion", - "map": "Ilshenar", - "priority": 2, - "rects": [ + "$type": "DungeonRegion", + "Name": "Sorcerer's Dungeon", + "Map": "Ilshenar", + "Priority": 2, + "Area": [ { "x1": 368, "y1": 0, "x2": 488, "y2": 120 }, { "x1": 200, "y1": 0, "x2": 368, "y2": 112 }, { "x1": 256, "y1": 120, "x2": 288, "y2": 152 }, { "x1": 48, "y1": 0, "x2": 184, "y2": 136 }, { "x1": 224, "y1": 112, "x2": 248, "y2": 144 } ], - "go": { "x": 429, "y": 108, "z": -28 }, - "entrance": { "x": 546, "y": 455 } + "GoLocation": { "x": 429, "y": 108, "z": -28 }, + "Entrance": { "x": 546, "y": 455 } }, { - "name": "Entrance Ancient Lair", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 50, - "rects": [{ "x1": 936, "y1": 488, "x2": 944, "y2": 496 }], - "go": { "x": 940, "y": 503, "z": -30 } + "$type": "BaseRegion", + "Name": "Entrance Ancient Lair", + "Map": "Ilshenar", + "Priority": 50, + "Area": [{ "x1": 936, "y1": 488, "x2": 944, "y2": 496 }], + "GoLocation": { "x": 940, "y": 503, "z": -30 } }, { - "name": "Ancient Lair", - "type": "DungeonRegion", - "map": "Ilshenar", - "priority": 2, - "rects": [{ "x1": 24, "y1": 664, "x2": 136, "y2": 760 }], - "go": { "x": 86, "y": 744, "z": -28 }, - "entrance": { "x": 938, "y": 494 } + "$type": "DungeonRegion", + "Name": "Ancient Lair", + "Map": "Ilshenar", + "Priority": 2, + "Area": [{ "x1": 24, "y1": 664, "x2": 136, "y2": 760 }], + "GoLocation": { "x": 86, "y": 744, "z": -28 }, + "Entrance": { "x": 938, "y": 494 } }, { - "name": "Gypsy Camp", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 50, - "rects": [{ "x1": 480, "y1": 520, "x2": 536, "y2": 568 }], - "go": { "x": 504, "y": 536, "z": -60 } + "$type": "BaseRegion", + "Name": "Gypsy Camp", + "Map": "Ilshenar", + "Priority": 50, + "Area": [{ "x1": 480, "y1": 520, "x2": 536, "y2": 568 }], + "GoLocation": { "x": 504, "y": 536, "z": -60 } }, { - "name": "Gypsy Camp 1", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 50, - "rects": [{ "x1": 1480, "y1": 600, "x2": 1536, "y2": 640 }], - "go": { "x": 1508, "y": 620, "z": 0 } + "$type": "BaseRegion", + "Name": "Gypsy Camp 1", + "Map": "Ilshenar", + "Priority": 50, + "Area": [{ "x1": 1480, "y1": 600, "x2": 1536, "y2": 640 }], + "GoLocation": { "x": 1508, "y": 620, "z": 0 } }, { - "name": "Gypsy Camp 2", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 48, - "rects": [{ "x1": 1592, "y1": 528, "x2": 1632, "y2": 568 }], - "go": { "x": 1612, "y": 548, "z": 0 } + "$type": "BaseRegion", + "Name": "Gypsy Camp 2", + "Map": "Ilshenar", + "Priority": 48, + "Area": [{ "x1": 1592, "y1": 528, "x2": 1632, "y2": 568 }], + "GoLocation": { "x": 1612, "y": 548, "z": 0 } }, { - "type": "BaseRegion", - "map": "Ilshenar", - "parent": "Gypsy Camp 2", - "logoutDelay": false, - "rects": [{ "x1": 1617, "y1": 546, "x2": 1629, "y2": 554 }] + "$type": "BaseRegion", + "Map": "Ilshenar", + "Parent": "Gypsy Camp 2", + "LogoutDelay": false, + "Area": [{ "x1": 1617, "y1": 546, "x2": 1629, "y2": 554 }] }, { - "name": "Juka Camp", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 50, - "rects": [{ "x1": 1192, "y1": 656, "x2": 1304, "y2": 792 }], - "go": { "x": 1248, "y": 724, "z": 0 } + "$type": "BaseRegion", + "Name": "Juka Camp", + "Map": "Ilshenar", + "Priority": 50, + "Area": [{ "x1": 1192, "y1": 656, "x2": 1304, "y2": 792 }], + "GoLocation": { "x": 1248, "y": 724, "z": 0 } }, { - "name": "Gypsy Camp 3", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 50, - "rects": [{ "x1": 928, "y1": 408, "x2": 968, "y2": 448 }], - "go": { "x": 948, "y": 428, "z": 0 } + "$type": "BaseRegion", + "Name": "Gypsy Camp 3", + "Map": "Ilshenar", + "Priority": 50, + "Area": [{ "x1": 928, "y1": 408, "x2": 968, "y2": 448 }], + "GoLocation": { "x": 948, "y": 428, "z": 0 } }, { - "name": "Gypsy Camp 4", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 50, - "rects": [{ "x1": 840, "y1": 440, "x2": 880, "y2": 488 }], - "go": { "x": 860, "y": 464, "z": 0 } + "$type": "BaseRegion", + "Name": "Gypsy Camp 4", + "Map": "Ilshenar", + "Priority": 50, + "Area": [{ "x1": 840, "y1": 440, "x2": 880, "y2": 488 }], + "GoLocation": { "x": 860, "y": 464, "z": 0 } }, { - "name": "Gypsy Camp 5", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 50, - "rects": [ + "$type": "BaseRegion", + "Name": "Gypsy Camp 5", + "Map": "Ilshenar", + "Priority": 50, + "Area": [ { "x1": 1216, "y1": 520, "x2": 1240, "y2": 568 }, { "x1": 1248, "y1": 568, "x2": 1264, "y2": 592 } ], - "go": { "x": 1228, "y": 544, "z": 0 } + "GoLocation": { "x": 1228, "y": 544, "z": 0 } }, { - "name": "Gypsy Camp 6", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 50, - "rects": [{ "x1": 1376, "y1": 416, "x2": 1408, "y2": 448 }], - "go": { "x": 1392, "y": 432, "z": 0 } + "$type": "BaseRegion", + "Name": "Gypsy Camp 6", + "Map": "Ilshenar", + "Priority": 50, + "Area": [{ "x1": 1376, "y1": 416, "x2": 1408, "y2": 448 }], + "GoLocation": { "x": 1392, "y": 432, "z": 0 } }, { - "name": "Lord Blackthorn's Ilshenar Castle", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 50, - "rects": [ + "$type": "BaseRegion", + "Name": "Lord Blackthorn's Ilshenar Castle", + "Map": "Ilshenar", + "Priority": 50, + "Area": [ { "x1": 1048, "y1": 616, "x2": 1120, "y2": 688 }, { "x1": 1080, "y1": 688, "x2": 1104, "y2": 712 } ], - "go": { "x": 1084, "y": 652, "z": 0 } + "GoLocation": { "x": 1084, "y": 652, "z": 0 } }, { - "name": "Shrine of the Virtues", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 50, - "rects": [{ "x1": 1072, "y1": 376, "x2": 1136, "y2": 432 }], - "go": { "x": 1104, "y": 404, "z": 0 } + "$type": "BaseRegion", + "Name": "Shrine of the Virtues", + "Map": "Ilshenar", + "Priority": 50, + "Area": [{ "x1": 1072, "y1": 376, "x2": 1136, "y2": 432 }], + "GoLocation": { "x": 1104, "y": 404, "z": 0 } }, { - "name": "Pass of Karnaugh", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 50, - "rects": [ + "$type": "BaseRegion", + "Name": "Pass of Karnaugh", + "Map": "Ilshenar", + "Priority": 50, + "Area": [ { "x1": 848, "y1": 288, "x2": 968, "y2": 336 }, { "x1": 936, "y1": 232, "x2": 968, "y2": 288 }, { "x1": 968, "y1": 248, "x2": 1088, "y2": 304 }, @@ -3098,138 +3098,137 @@ { "x1": 1048, "y1": 304, "x2": 1184, "y2": 360 }, { "x1": 1184, "y1": 336, "x2": 1248, "y2": 392 } ], - "go": { "x": 908, "y": 312, "z": 0 } + "GoLocation": { "x": 908, "y": 312, "z": 0 } }, { - "name": "Vinculum Inn", - "type": "BaseRegion", - "map": "Ilshenar", - "priority": 50, - "rects": [{ "x1": 658, "y1": 654, "x2": 671, "y2": 678 }], - "go": { "x": 656, "y": 666, "z": -36 } + "$type": "BaseRegion", + "Name": "Vinculum Inn", + "Map": "Ilshenar", + "Priority": 50, + "Area": [{ "x1": 658, "y1": 654, "x2": 671, "y2": 678 }], + "GoLocation": { "x": 656, "y": 666, "z": -36 } }, { - "type": "BaseRegion", - "map": "Ilshenar", - "parent": "Vinculum Inn", - "logoutDelay": false, - "rects": [{ "x1": 658, "y1": 654, "x2": 671, "y2": 678 }] + "$type": "BaseRegion", + "Map": "Ilshenar", + "Parent": "Vinculum Inn", + "LogoutDelay": false, + "Area": [{ "x1": 658, "y1": 654, "x2": 671, "y2": 678 }] }, { - "name": "Gravewater Dock", - "type": "MondainRegion", - "map": "Malas", - "priority": 50, - "rects": [{ "x1": 1692, "y1": 1551, "x2": 1708, "y2": 1567 }] + "$type": "MondainRegion", + "Name": "Gravewater Dock", + "Map": "Malas", + "Priority": 50, + "Area": [{ "x1": 1692, "y1": 1551, "x2": 1708, "y2": 1567 }] }, { - "name": "Bedlam", - "type": "MondainRegion", - "map": "Malas", - "priority": 50, - "music": "GrizzleDungeon", - "rects": [{ "x1": 80, "y1": 1590, "x2": 210, "y2": 1690 }], - "go": { "x": 117, "y": 1681, "z": 0 }, - "entrance": { "x": 2068, "y": 1372 } + "$type": "MondainRegion", + "Name": "Bedlam", + "Map": "Malas", + "Priority": 50, + "Music": "GrizzleDungeon", + "Area": [{ "x1": 80, "y1": 1590, "x2": 210, "y2": 1690 }], + "GoLocation": { "x": 117, "y": 1681, "z": 0 }, + "Entrance": { "x": 2068, "y": 1372 } }, { - "name": "Labyrinth", - "type": "MondainRegion", - "map": "Malas", - "priority": 50, - "music": "Dungeon9", - "rects": [{ "x1": 255, "y1": 1791, "x2": 511, "y2": 2047 }], - "go": { "x": 331, "y": 1973, "z": 0 }, - "entrance": { "x": 1733, "y": 978 } + "$type": "MondainRegion", + "Name": "Labyrinth", + "Map": "Malas", + "Priority": 50, + "Music": "Dungeon9", + "Area": [{ "x1": 255, "y1": 1791, "x2": 511, "y2": 2047 }], + "GoLocation": { "x": 331, "y": 1973, "z": 0 }, + "Entrance": { "x": 1733, "y": 978 } }, { - "name": "TheCitadel", - "type": "MondainRegion", - "map": "Malas", - "priority": 50, - "music": "Dungeon9", - "rects": [{ "x1": 65, "y1": 1865, "x2": 195, "y2": 1990 }], - "go": { "x": 106, "y": 1884, "z": 0 }, - "entrance": { "x": 1349, "y": 769 } + "$type": "MondainRegion", + "Name": "TheCitadel", + "Map": "Malas", + "Priority": 50, + "Music": "Dungeon9", + "Area": [{ "x1": 65, "y1": 1865, "x2": 195, "y2": 1990 }], + "GoLocation": { "x": 106, "y": 1884, "z": 0 }, + "Entrance": { "x": 1349, "y": 769 } }, { - "name": "Luna", - "type": "TownRegion", - "map": "Malas", - "priority": 50, - "music": "tavern04", - "rects": [{ "x1": 945, "y1": 490, "x2": 1036, "y2": 551 }], - "go": { "x": 989, "y": 520, "z": -50 } + "$type": "TownRegion", + "Name": "Luna", + "Map": "Malas", + "Priority": 50, + "Music": "tavern04", + "Area": [{ "x1": 945, "y1": 490, "x2": 1036, "y2": 551 }], + "GoLocation": { "x": 989, "y": 520, "z": -50 } }, { - "type": "BaseRegion", - "map": "Malas", - "parent": "Luna", - "logoutDelay": false, - "rects": [{ "x1": 986, "y1": 509, "x2": 1004, "y2": 530 }] + "$type": "BaseRegion", + "Map": "Malas", + "Parent": "Luna", + "LogoutDelay": false, + "Area": [{ "x1": 986, "y1": 509, "x2": 1004, "y2": 530 }] }, { - "name": "Umbra", - "type": "TownRegion", - "map": "Malas", - "priority": 50, - "rects": [ + "$type": "TownRegion", + "Name": "Umbra", + "Map": "Malas", + "Priority": 50, + "Area": [ { "x1": 2042, "y1": 1265, "x2": 2090, "y2": 1278 }, { "x1": 1960, "y1": 1278, "x2": 2106, "y2": 1413 }, { "x1": 2004, "y1": 1413, "x2": 2040, "y2": 1419 } ], - "go": { "x": 2049, "y": 1344, "z": -85 } + "GoLocation": { "x": 2049, "y": 1344, "z": -85 } }, { - "type": "BaseRegion", - "map": "Malas", - "parent": "Umbra", - "logoutDelay": false, - "rects": [{ "x1": 2031, "y1": 1311, "x2": 2046, "y2": 1325 }] + "$type": "BaseRegion", + "Map": "Malas", + "Parent": "Umbra", + "LogoutDelay": false, + "Area": [{ "x1": 2031, "y1": 1311, "x2": 2046, "y2": 1325 }] }, { - "name": "Doom", - "type": "DungeonRegion", - "map": "Malas", - "priority": 50, - "music": "Dungeon9", - "rects": [{ "x1": 256, "y1": 0, "x2": 512, "y2": 304 }], - "go": { "x": 2366, "y": 1268, "z": -85 }, - "entrance": { "x": 2357, "y": 1268 } + "$type": "DungeonRegion", + "Name": "Doom", + "Map": "Malas", + "Priority": 50, + "Music": "Dungeon9", + "Area": [{ "x1": 256, "y1": 0, "x2": 512, "y2": 304 }], + "GoLocation": { "x": 2366, "y": 1268, "z": -85 }, + "Entrance": { "x": 2357, "y": 1268 } }, { - "name": "Doom Gauntlet", - "type": "DungeonRegion", - "map": "Malas", - "priority": 50, - "music": "Dungeon9", - "rects": [{ "x1": 256, "y1": 304, "x2": 512, "y2": 560 }], - "go": { "x": 429, "y": 340, "z": -1 }, - "entrance": { "x": 2357, "y": 1268 } + "$type": "DungeonRegion", + "Name": "Doom Gauntlet", + "Map": "Malas", + "Priority": 50, + "Music": "Dungeon9", + "Area": [{ "x1": 256, "y1": 304, "x2": 512, "y2": 560 }], + "GoLocation": { "x": 429, "y": 340, "z": -1 }, + "Entrance": { "x": 2357, "y": 1268 } }, { - "name": "Orc Fortress", - "type": "BaseRegion", - "map": "Malas", - "priority": 50, - "rects": [{ "x1": 1295, "y1": 1189, "x2": 1395, "y2": 1294 }], - "go": { "x": 1340, "y": 1226, "z": -90 } + "$type": "BaseRegion", + "Name": "Orc Fortress", + "Map": "Malas", + "Priority": 50, + "Area": [{ "x1": 1295, "y1": 1189, "x2": 1395, "y2": 1294 }], + "GoLocation": { "x": 1340, "y": 1226, "z": -90 } }, { - "name": "Crystal Cave Entrance", - "type": "NoHousingRegion", - "map": "Malas", - "priority": 50, - "rects": [{ "x1": 1176, "y1": 509, "x2": 1219, "y2": 522 }], - "go": { "x": 1195, "y": 515, "z": -90 } + "$type": "NoHousingRegion", + "Name": "Crystal Cave Entrance", + "Map": "Malas", + "Priority": 50, + "Area": [{ "x1": 1176, "y1": 509, "x2": 1219, "y2": 522 }], + "GoLocation": { "x": 1195, "y": 515, "z": -90 } }, { - "name": "Protected Island", - "type": "NoHousingRegion", - "map": "Malas", - "priority": 50, - "smartNoHousing": true, - "rects": [ + "$type": "NoHousingRegion", + "Name": "Protected Island", + "Map": "Malas", + "Priority": 50, + "Area": [ { "x1": 1976, "y1": 101, "x2": 2448, "y2": 345 }, { "x1": 2051, "y1": 345, "x2": 2356, "y2": 382 }, { "x1": 2026, "y1": 345, "x2": 2051, "y2": 370 }, @@ -3237,133 +3236,130 @@ { "x1": 2254, "y1": 382, "x2": 2352, "y2": 420 }, { "x1": 2222, "y1": 382, "x2": 2254, "y2": 402 } ], - "go": { "x": 2104, "y": 380, "z": -90 } + "GoLocation": { "x": 2104, "y": 380, "z": -90 } }, { - "name": "Grand Arena", - "type": "NoHousingRegion", - "map": "Malas", - "priority": 50, - "rects": [{ "x1": 919, "y1": 622, "x2": 962, "y2": 652 }], - "go": { "x": 961, "y": 637, "z": -90 } + "$type": "NoHousingRegion", + "Name": "Grand Arena", + "Map": "Malas", + "Priority": 50, + "Area": [{ "x1": 919, "y1": 622, "x2": 962, "y2": 652 }], + "GoLocation": { "x": 961, "y": 637, "z": -90 } }, { - "name": "Hanse's Hostel", - "type": "BaseRegion", - "map": "Malas", - "priority": 50, - "logoutDelay": false, - "rects": [ + "$type": "BaseRegion", + "Name": "Hanse's Hostel", + "Map": "Malas", + "Priority": 50, + "LogoutDelay": false, + "Area": [ { "x1": 1049, "y1": 1420, "x2": 1062, "y2": 1445 }, { "x1": 1062, "y1": 1420, "x2": 1065, "y2": 1431 }, { "x1": 1062, "y1": 1439, "x2": 1065, "y2": 1445 } ], - "go": { "x": 1063, "y": 1435, "z": -90 } + "GoLocation": { "x": 1063, "y": 1435, "z": -90 } }, { - "name": "Yomotsu Mines", - "type": "DungeonRegion", - "map": "Malas", - "priority": 50, - "music": "TokunoDungeon", - "rects": [{ "x1": 0, "y1": 0, "x2": 129, "y2": 129 }], - "go": { "x": 6, "y": 118, "z": 0 }, - "entrance": { "x": 259, "y": 783 } + "$type": "DungeonRegion", + "Name": "Yomotsu Mines", + "Map": "Malas", + "Priority": 50, + "Music": "TokunoDungeon", + "Area": [{ "x1": 0, "y1": 0, "x2": 129, "y2": 129 }], + "GoLocation": { "x": 6, "y": 118, "z": 0 }, + "Entrance": { "x": 259, "y": 783 } }, { - "name": "Fan Dancer's Dojo", - "type": "DungeonRegion", - "map": "Malas", - "priority": 50, - "music": "TokunoDungeon", - "rects": [{ "x1": 40, "y1": 320, "x2": 210, "y2": 720 }], - "go": { "x": 71, "y": 337, "z": 0 }, - "entrance": { "x": 977, "y": 223 } + "$type": "DungeonRegion", + "Name": "Fan Dancer's Dojo", + "Map": "Malas", + "Priority": 50, + "Music": "TokunoDungeon", + "Area": [{ "x1": 40, "y1": 320, "x2": 210, "y2": 720 }], + "GoLocation": { "x": 71, "y": 337, "z": 0 }, + "Entrance": { "x": 977, "y": 223 } }, { - "name": "Samurai start location", - "type": "BaseRegion", - "map": "Malas", - "priority": 50, - "music": "Zento", - "rects": [{ "x1": 320, "y1": 690, "x2": 435, "y2": 790 }] + "$type": "BaseRegion", + "Name": "Samurai start location", + "Map": "Malas", + "Priority": 50, + "Music": "Zento", + "Area": [{ "x1": 320, "y1": 690, "x2": 435, "y2": 790 }] }, { - "name": "Ninja start location", - "type": "BaseRegion", - "map": "Malas", - "priority": 50, - "music": "Zento", - "rects": [{ "x1": 360, "y1": 795, "x2": 440, "y2": 835 }] + "$type": "BaseRegion", + "Name": "Ninja start location", + "Map": "Malas", + "Priority": 50, + "Music": "Zento", + "Area": [{ "x1": 360, "y1": 795, "x2": 440, "y2": 835 }] }, { - "name": "Ninja cave", - "type": "BaseRegion", - "map": "Malas", - "priority": 50, - "rects": [{ "x1": 360, "y1": 960, "x2": 460, "y2": 1175 }] + "$type": "BaseRegion", + "Name": "Ninja cave", + "Map": "Malas", + "Priority": 50, + "Area": [{ "x1": 360, "y1": 960, "x2": 460, "y2": 1175 }] }, { - "name": "Isle of the Divide", - "type": "NoHousingRegion", - "map": "Malas", - "priority": 50, - "smartNoHousing": true, - "rects": [{ "x1": 1533, "y1": 849, "x2": 1828, "y2": 1044 }], - "go": { "x": 1731, "y": 982, "z": -80 } + "$type": "NoHousingRegion", + "Name": "Isle of the Divide", + "Map": "Malas", + "Priority": 50, + "Area": [{ "x1": 1533, "y1": 849, "x2": 1828, "y2": 1044 }], + "GoLocation": { "x": 1731, "y": 982, "z": -80 } }, { - "name": "Moongates", - "type": "GuardedRegion", - "map": "Tokuno", - "priority": 50, - "rects": [ + "$type": "GuardedRegion", + "Name": "Moongates", + "Map": "Tokuno", + "Priority": 50, + "Area": [ { "x1": 1167, "y1": 996, "x2": 1171, "y2": 1000 }, { "x1": 799, "y1": 1201, "x2": 805, "y2": 1207 }, { "x1": 267, "y1": 625, "x2": 274, "y2": 632 } ] }, { - "name": "Zento", - "type": "TownRegion", - "map": "Tokuno", - "priority": 50, - "music": "Zento", - "rects": [{ "x1": 656, "y1": 1192, "x2": 816, "y2": 1320 }], - "go": { "x": 736, "y": 1256, "z": 30 } + "$type": "TownRegion", + "Name": "Zento", + "Map": "Tokuno", + "Priority": 50, + "Music": "Zento", + "Area": [{ "x1": 656, "y1": 1192, "x2": 816, "y2": 1320 }], + "GoLocation": { "x": 736, "y": 1256, "z": 30 } }, { - "type": "BaseRegion", - "map": "Tokuno", - "parent": "Zento", - "logoutDelay": false, - "rects": [{ "x1": 674, "y1": 1203, "x2": 699, "y2": 1219 }] + "$type": "BaseRegion", + "Map": "Tokuno", + "Parent": "Zento", + "LogoutDelay": false, + "Area": [{ "x1": 674, "y1": 1203, "x2": 699, "y2": 1219 }] }, { - "name": "Fan Dancer's Dojo", - "type": "NoHousingRegion", - "map": "Tokuno", - "priority": 50, - "smartNoHousing": true, - "rects": [{ "x1": 969, "y1": 194, "x2": 992, "y2": 224 }], - "go": { "x": 977, "y": 223, "z": 23 } + "$type": "NoHousingRegion", + "Name": "Fan Dancer's Dojo", + "Map": "Tokuno", + "Priority": 50, + "Area": [{ "x1": 969, "y1": 194, "x2": 992, "y2": 224 }], + "GoLocation": { "x": 977, "y": 223, "z": 23 } }, { - "name": "Bushido Dojo", - "type": "NoHousingRegion", - "map": "Tokuno", - "priority": 50, - "smartNoHousing": true, - "rects": [{ "x1": 283, "y1": 361, "x2": 351, "y2": 463 }], - "go": { "x": 320, "y": 408, "z": 32 } + "$type": "NoHousingRegion", + "Name": "Bushido Dojo", + "Map": "Tokuno", + "Priority": 50, + "Area": [{ "x1": 283, "y1": 361, "x2": 351, "y2": 463 }], + "GoLocation": { "x": 320, "y": 408, "z": 32 } }, { - "name": "Abyss", - "type": "DungeonRegion", - "map": "TerMur", - "priority": 50, - "music": "StygianAbyss", - "rects": [ + "$type": "DungeonRegion", + "Name": "Abyss", + "Map": "TerMur", + "Priority": 50, + "Music": "StygianAbyss", + "Area": [ { "x1": 301, "y1": 328, "x2": 1076, "y2": 802 }, { "x1": 780, "y1": 32, "x2": 1076, "y2": 328 }, { "x1": 436, "y1": 802, "x2": 740, "y2": 980 }, @@ -3375,49 +3371,48 @@ { "x1": 0, "y1": 286, "x2": 137, "y2": 445 }, { "x1": 254, "y1": 70, "x2": 500, "y2": 253 } ], - "go": { "x": 946, "y": 72, "z": 72 } + "GoLocation": { "x": 946, "y": 72, "z": 72 } }, { - "name": "Abyssal Lair", - "type": "BaseRegion", - "map": "TerMur", - "parent": "Abyss", - "priority": 50, - "rects": [{ "x1": 931, "y1": 314, "x2": 1031, "y2": 454 }], - "go": { "x": 985, "y": 366, "z": -11 } + "$type": "BaseRegion", + "Name": "Abyssal Lair", + "Map": "TerMur", + "Parent": "Abyss", + "Priority": 50, + "Area": [{ "x1": 931, "y1": 314, "x2": 1031, "y2": 454 }], + "GoLocation": { "x": 985, "y": 366, "z": -11 } }, { - "name": "MedusasLair", - "type": "BaseRegion", - "map": "TerMur", - "parent": "Abyss", - "priority": 100, - "rects": [ + "$type": "BaseRegion", + "Name": "MedusasLair", + "Map": "TerMur", + "Parent": "Abyss", + "Priority": 100, + "Area": [ { "x1": 764, "y1": 894, "x2": 833, "y2": 983 }, { "x1": 816, "y1": 749, "x2": 829, "y2": 765 } ], - "go": { "x": 771, "y": 928, "z": 0 } + "GoLocation": { "x": 771, "y": 928, "z": 0 } }, { - "name": "NPC Encampment", - "type": "BaseRegion", - "map": "TerMur", - "parent": "Abyss", - "priority": 100, - "logoutDelay": false, - "smartNoHousing": true, - "guardsDisabled": true, - "rects": [{ "x1": 1087, "y1": 1127, "z1": -42, "x2": 1096, "y2": 1133, "z2": 128 }], - "go": { "x": 1090, "y": 1130, "z": -42 }, - "entrance": { "x": 1090, "y": 1132 } + "$type": "BaseRegion", + "Name": "NPC Encampment", + "Map": "TerMur", + "Parent": "Abyss", + "Priority": 100, + "LogoutDelay": false, + "GuardsDisabled": true, + "Area": [{ "x1": 1087, "y1": 1127, "z1": -42, "x2": 1096, "y2": 1133, "z2": 128 }], + "GoLocation": { "x": 1090, "y": 1130, "z": -42 }, + "Entrance": { "x": 1090, "y": 1132 } }, { - "name": "Cavern of the Discarded", - "type": "BaseRegion", - "map": "TerMur", - "parent": "Abyss", - "priority": 50, - "rects": [ + "$type": "BaseRegion", + "Name": "Cavern of the Discarded", + "Map": "TerMur", + "Parent": "Abyss", + "Priority": 50, + "Area": [ { "x1": 887, "y1": 475, "x2": 1000, "y2": 575 }, { "x1": 926, "y1": 533, "x2": 971, "y2": 553 }, { "x1": 928, "y1": 543, "x2": 970, "y2": 573 }, @@ -3426,33 +3421,33 @@ { "x1": 938, "y1": 541, "x2": 958, "y2": 572 }, { "x1": 961, "y1": 527, "x2": 983, "y2": 559 } ], - "go": { "x": 912, "y": 501, "z": -12 } + "GoLocation": { "x": 912, "y": 501, "z": -12 } }, { - "name": "Chamber of Virtue", - "type": "BaseRegion", - "map": "TerMur", - "parent": "Abyss", - "priority": 50, - "rects": [{ "x1": 739, "y1": 465, "x2": 760, "y2": 486 }], - "go": { "x": 747, "y": 474, "z": -17 } + "$type": "BaseRegion", + "Name": "Chamber of Virtue", + "Map": "TerMur", + "Parent": "Abyss", + "Priority": 50, + "Area": [{ "x1": 739, "y1": 465, "x2": 760, "y2": 486 }], + "GoLocation": { "x": 747, "y": 474, "z": -17 } }, { - "name": "Crimson Veins", - "type": "BaseRegion", - "map": "TerMur", - "parent": "Abyss", - "priority": 50, - "rects": [{ "x1": 931, "y1": 135, "x2": 996, "y2": 200 }], - "go": { "x": 974, "y": 164, "z": -11 } + "$type": "BaseRegion", + "Name": "Crimson Veins", + "Map": "TerMur", + "Parent": "Abyss", + "Priority": 50, + "Area": [{ "x1": 931, "y1": 135, "x2": 996, "y2": 200 }], + "GoLocation": { "x": 974, "y": 164, "z": -11 } }, { - "name": "Enslaved Goblins", - "type": "BaseRegion", - "map": "TerMur", - "parent": "Abyss", - "priority": 50, - "rects": [ + "$type": "BaseRegion", + "Name": "Enslaved Goblins", + "Map": "TerMur", + "Parent": "Abyss", + "Priority": 50, + "Area": [ { "x1": 538, "y1": 806, "x2": 613, "y2": 856 }, { "x1": 539, "y1": 790, "x2": 614, "y2": 840 }, { "x1": 553, "y1": 791, "x2": 613, "y2": 841 }, @@ -3460,39 +3455,39 @@ { "x1": 570, "y1": 773, "x2": 613, "y2": 857 }, { "x1": 571, "y1": 788, "x2": 596, "y2": 813 } ], - "go": { "x": 581, "y": 815, "z": -45 } + "GoLocation": { "x": 581, "y": 815, "z": -45 } }, { - "name": "Fairy Dragon Lair", - "type": "BaseRegion", - "map": "TerMur", - "parent": "Abyss", - "priority": 50, - "rects": [{ "x1": 849, "y1": 254, "x2": 916, "y2": 297 }], - "go": { "x": 888, "y": 277, "z": 3 } + "$type": "BaseRegion", + "Name": "Fairy Dragon Lair", + "Map": "TerMur", + "Parent": "Abyss", + "Priority": 50, + "Area": [{ "x1": 849, "y1": 254, "x2": 916, "y2": 297 }], + "GoLocation": { "x": 888, "y": 277, "z": 3 } }, { - "name": "Fire Temple Ruins", - "type": "BaseRegion", - "map": "TerMur", - "parent": "Abyss", - "priority": 50, - "rects": [ + "$type": "BaseRegion", + "Name": "Fire Temple Ruins", + "Map": "TerMur", + "Parent": "Abyss", + "Priority": 50, + "Area": [ { "x1": 474, "y1": 766, "x2": 563, "y2": 789 }, { "x1": 485, "y1": 760, "x2": 553, "y2": 789 }, { "x1": 495, "y1": 750, "x2": 560, "y2": 779 }, { "x1": 506, "y1": 750, "x2": 572, "y2": 782 }, { "x1": 520, "y1": 739, "x2": 584, "y2": 771 } ], - "go": { "x": 519, "y": 765, "z": -92 } + "GoLocation": { "x": 519, "y": 765, "z": -92 } }, { - "name": "Fractured City", - "type": "BaseRegion", - "map": "TerMur", - "parent": "Abyss", - "priority": 50, - "rects": [ + "$type": "BaseRegion", + "Name": "Fractured City", + "Map": "TerMur", + "Parent": "Abyss", + "Priority": 50, + "Area": [ { "x1": 664, "y1": 439, "x2": 731, "y2": 527 }, { "x1": 726, "y1": 505, "x2": 771, "y2": 527 }, { "x1": 712, "y1": 402, "x2": 820, "y2": 460 }, @@ -3500,351 +3495,351 @@ { "x1": 771, "y1": 460, "x2": 810, "y2": 518 }, { "x1": 808, "y1": 480, "x2": 820, "y2": 512 } ], - "go": { "x": 780, "y": 445, "z": -15 } + "GoLocation": { "x": 780, "y": 445, "z": -15 } }, { - "name": "Lands of the Lich", - "type": "BaseRegion", - "map": "TerMur", - "parent": "Abyss", - "priority": 50, - "rects": [ + "$type": "BaseRegion", + "Name": "Lands of the Lich", + "Map": "TerMur", + "Parent": "Abyss", + "Priority": 50, + "Area": [ { "x1": 499, "y1": 575, "x2": 570, "y2": 695 }, { "x1": 554, "y1": 600, "x2": 628, "y2": 642 } ], - "go": { "x": 538, "y": 656, "z": 8 } + "GoLocation": { "x": 538, "y": 656, "z": 8 } }, { - "name": "Lava Caldera", - "type": "BaseRegion", - "map": "TerMur", - "parent": "Abyss", - "priority": 50, - "rects": [{ "x1": 553, "y1": 860, "x2": 639, "y2": 948 }], - "go": { "x": 587, "y": 895, "z": -73 } + "$type": "BaseRegion", + "Name": "Lava Caldera", + "Map": "TerMur", + "Parent": "Abyss", + "Priority": 50, + "Area": [{ "x1": 553, "y1": 860, "x2": 639, "y2": 948 }], + "GoLocation": { "x": 587, "y": 895, "z": -73 } }, { - "name": "Passage of Tears", - "type": "BaseRegion", - "map": "TerMur", - "parent": "Abyss", - "priority": 50, - "rects": [{ "x1": 638, "y1": 530, "x2": 738, "y2": 635 }], - "go": { "x": 685, "y": 579, "z": -15 } + "$type": "BaseRegion", + "Name": "Passage of Tears", + "Map": "TerMur", + "Parent": "Abyss", + "Priority": 50, + "Area": [{ "x1": 638, "y1": 530, "x2": 738, "y2": 635 }], + "GoLocation": { "x": 685, "y": 579, "z": -15 } }, { - "name": "Secret Garden", - "type": "BaseRegion", - "map": "TerMur", - "parent": "Abyss", - "priority": 50, - "rects": [{ "x1": 413, "y1": 678, "x2": 489, "y2": 749 }], - "go": { "x": 462, "y": 719, "z": 22 } + "$type": "BaseRegion", + "Name": "Secret Garden", + "Map": "TerMur", + "Parent": "Abyss", + "Priority": 50, + "Area": [{ "x1": 413, "y1": 678, "x2": 489, "y2": 749 }], + "GoLocation": { "x": 462, "y": 719, "z": 22 } }, { - "name": "Serpents Lair", - "type": "BaseRegion", - "map": "TerMur", - "parent": "Abyss", - "priority": 50, - "rects": [ + "$type": "BaseRegion", + "Name": "Serpents Lair", + "Map": "TerMur", + "Parent": "Abyss", + "Priority": 50, + "Area": [ { "x1": 681, "y1": 679, "x2": 849, "y2": 790 }, { "x1": 703, "y1": 656, "x2": 850, "y2": 789 }, { "x1": 785, "y1": 640, "x2": 850, "y2": 775 } ], - "go": { "x": 711, "y": 720, "z": -11 } + "GoLocation": { "x": 711, "y": 720, "z": -11 } }, { - "name": "Silver Sapling", - "type": "BaseRegion", - "map": "TerMur", - "parent": "Abyss", - "priority": 50, - "rects": [{ "x1": 311, "y1": 582, "x2": 379, "y2": 650 }], - "go": { "x": 341, "y": 619, "z": 26 } + "$type": "BaseRegion", + "Name": "Silver Sapling", + "Map": "TerMur", + "Parent": "Abyss", + "Priority": 50, + "Area": [{ "x1": 311, "y1": 582, "x2": 379, "y2": 650 }], + "GoLocation": { "x": 341, "y": 619, "z": 26 } }, { - "name": "Skeletal Dragon", - "type": "BaseRegion", - "map": "TerMur", - "parent": "Abyss", - "priority": 50, - "rects": [{ "x1": 643, "y1": 809, "x2": 698, "y2": 872 }], - "go": { "x": 675, "y": 828, "z": -109 } + "$type": "BaseRegion", + "Name": "Skeletal Dragon", + "Map": "TerMur", + "Parent": "Abyss", + "Priority": 50, + "Area": [{ "x1": 643, "y1": 809, "x2": 698, "y2": 872 }], + "GoLocation": { "x": 675, "y": 828, "z": -109 } }, { - "name": "Sutek the Mage", - "type": "BaseRegion", - "map": "TerMur", - "parent": "Abyss", - "priority": 50, - "rects": [{ "x1": 901, "y1": 574, "x2": 954, "y2": 614 }], - "go": { "x": 924, "y": 595, "z": -14 } + "$type": "BaseRegion", + "Name": "Sutek the Mage", + "Map": "TerMur", + "Parent": "Abyss", + "Priority": 50, + "Area": [{ "x1": 901, "y1": 574, "x2": 954, "y2": 614 }], + "GoLocation": { "x": 924, "y": 595, "z": -14 } }, { - "name": "Underworld", - "type": "DungeonRegion", - "map": "TerMur", - "priority": 50, - "music": "HumanLevel", - "rects": [{ "x1": 898, "y1": 808, "x2": 1280, "y2": 1231 }], - "go": { "x": 1128, "y": 1207, "z": -2 } + "$type": "DungeonRegion", + "Name": "Underworld", + "Map": "TerMur", + "Priority": 50, + "Music": "HumanLevel", + "Area": [{ "x1": 898, "y1": 808, "x2": 1280, "y2": 1231 }], + "GoLocation": { "x": 1128, "y": 1207, "z": -2 } }, { - "name": "Atoll Bend", - "type": "DungeonRegion", - "map": "TerMur", - "priority": 50, - "rects": [{ "x1": 1027, "y1": 3311, "x2": 1224, "y2": 3514 }], - "go": { "x": 1118, "y": 3408, "z": -42 } + "$type": "DungeonRegion", + "Name": "Atoll Bend", + "Map": "TerMur", + "Priority": 50, + "Area": [{ "x1": 1027, "y1": 3311, "x2": 1224, "y2": 3514 }], + "GoLocation": { "x": 1118, "y": 3408, "z": -42 } }, { - "name": "Chicken Chase", - "type": "DungeonRegion", - "map": "TerMur", - "priority": 50, + "$type": "DungeonRegion", + "Name": "Chicken Chase", + "Map": "TerMur", + "Priority": 50, "rune": "Chicken Chase", - "rects": [{ "x1": 448, "y1": 3352, "x2": 613, "y2": 3480 }], - "go": { "x": 560, "y": 3412, "z": 37 } + "Area": [{ "x1": 448, "y1": 3352, "x2": 613, "y2": 3480 }], + "GoLocation": { "x": 560, "y": 3412, "z": 37 } }, { - "name": "Fishermans Reach", - "type": "DungeonRegion", - "map": "TerMur", - "priority": 50, - "rects": [{ "x1": 547, "y1": 2835, "x2": 745, "y2": 3102 }], - "go": { "x": 631, "y": 3035, "z": 36 } + "$type": "DungeonRegion", + "Name": "Fishermans Reach", + "Map": "TerMur", + "Priority": 50, + "Area": [{ "x1": 547, "y1": 2835, "x2": 745, "y2": 3102 }], + "GoLocation": { "x": 631, "y": 3035, "z": 36 } }, { - "name": "Gated Isle", - "type": "DungeonRegion", - "map": "TerMur", - "priority": 50, - "rects": [{ "x1": 603, "y1": 3836, "x2": 815, "y2": 4043 }], - "go": { "x": 703, "y": 3934, "z": -31 } + "$type": "DungeonRegion", + "Name": "Gated Isle", + "Map": "TerMur", + "Priority": 50, + "Area": [{ "x1": 603, "y1": 3836, "x2": 815, "y2": 4043 }], + "GoLocation": { "x": 703, "y": 3934, "z": -31 } }, { - "name": "High Plain", - "type": "DungeonRegion", - "map": "TerMur", - "priority": 50, - "rects": [{ "x1": 748, "y1": 2843, "x2": 981, "y2": 3050 }], - "go": { "x": 863, "y": 2931, "z": 38 } + "$type": "DungeonRegion", + "Name": "High Plain", + "Map": "TerMur", + "Priority": 50, + "Area": [{ "x1": 748, "y1": 2843, "x2": 981, "y2": 3050 }], + "GoLocation": { "x": 863, "y": 2931, "z": 38 } }, { - "name": "Holy City", - "type": "BaseRegion", - "map": "TerMur", - "priority": 50, - "music": "Holycity", - "rects": [{ "x1": 922, "y1": 3838, "x2": 1071, "y2": 3965 }], - "go": { "x": 997, "y": 3869, "z": -42 } + "$type": "BaseRegion", + "Name": "Holy City", + "Map": "TerMur", + "Priority": 50, + "Music": "Holycity", + "Area": [{ "x1": 922, "y1": 3838, "x2": 1071, "y2": 3965 }], + "GoLocation": { "x": 997, "y": 3869, "z": -42 } }, { - "name": "Kepetch Waste", - "type": "DungeonRegion", - "map": "TerMur", - "priority": 50, - "rects": [{ "x1": 356, "y1": 3143, "x2": 523, "y2": 3224 }], - "go": { "x": 447, "y": 3188, "z": 20 } + "$type": "DungeonRegion", + "Name": "Kepetch Waste", + "Map": "TerMur", + "Priority": 50, + "Area": [{ "x1": 356, "y1": 3143, "x2": 523, "y2": 3224 }], + "GoLocation": { "x": 447, "y": 3188, "z": 20 } }, { - "name": "Lost Settlement", - "type": "DungeonRegion", - "map": "TerMur", - "priority": 50, - "rects": [{ "x1": 454, "y1": 3708, "x2": 648, "y2": 3957 }], - "go": { "x": 526, "y": 3822, "z": -44 } + "$type": "DungeonRegion", + "Name": "Lost Settlement", + "Map": "TerMur", + "Priority": 50, + "Area": [{ "x1": 454, "y1": 3708, "x2": 648, "y2": 3957 }], + "GoLocation": { "x": 526, "y": 3822, "z": -44 } }, { - "name": "Moongates", - "type": "GuardedRegion", - "map": "TerMur", - "priority": 50, - "rects": [ + "$type": "GuardedRegion", + "Name": "Moongates", + "Map": "TerMur", + "Priority": 50, + "Area": [ { "x1": 852, "y1": 3525, "x2": 867, "y2": 3540 }, { "x1": 925, "y1": 3988, "x2": 940, "y2": 4003 } ] }, { - "name": "Northern Steppes", - "type": "DungeonRegion", - "map": "TerMur", - "priority": 50, - "rects": [{ "x1": 694, "y1": 3020, "x2": 954, "y2": 3148 }], - "go": { "x": 822, "y": 3063, "z": 61 } + "$type": "DungeonRegion", + "Name": "Northern Steppes", + "Map": "TerMur", + "Priority": 50, + "Area": [{ "x1": 694, "y1": 3020, "x2": 954, "y2": 3148 }], + "GoLocation": { "x": 822, "y": 3063, "z": 61 } }, { - "name": "Raptor Island", - "type": "DungeonRegion", - "map": "TerMur", - "priority": 50, - "rects": [ + "$type": "DungeonRegion", + "Name": "Raptor Island", + "Map": "TerMur", + "Priority": 50, + "Area": [ { "x1": 712, "y1": 3765, "x2": 879, "y2": 3829 }, { "x1": 728, "y1": 3809, "x2": 839, "y2": 3923 }, { "x1": 769, "y1": 3721, "x2": 972, "y2": 3768 }, { "x1": 808, "y1": 3692, "x2": 930, "y2": 3732 } ], - "go": { "x": 816, "y": 3778, "z": -42 } + "GoLocation": { "x": 816, "y": 3778, "z": -42 } }, { - "name": "Royal City", - "type": "TownRegion", - "map": "TerMur", - "priority": 50, - "music": "RoyalCity", - "rects": [{ "x1": 624, "y1": 3296, "x2": 927, "y2": 3583 }], - "go": { "x": 750, "y": 3440, "z": -20 } + "$type": "TownRegion", + "Name": "Royal City", + "Map": "TerMur", + "Priority": 50, + "Music": "RoyalCity", + "Area": [{ "x1": 624, "y1": 3296, "x2": 927, "y2": 3583 }], + "GoLocation": { "x": 750, "y": 3440, "z": -20 } }, { - "name": "Queen's Palace", - "type": "BaseRegion", - "map": "TerMur", - "parent": "Royal City", - "music": "QueenPalace", - "rects": [{ "x1": 717, "y1": 3339, "x2": 785, "y2": 3412 }], - "go": { "x": 748, "y": 3357, "z": 55 } + "$type": "BaseRegion", + "Name": "Queen's Palace", + "Map": "TerMur", + "Parent": "Royal City", + "Music": "QueenPalace", + "Area": [{ "x1": 717, "y1": 3339, "x2": 785, "y2": 3412 }], + "GoLocation": { "x": 748, "y": 3357, "z": 55 } }, { - "name": "Royal City Inn", - "type": "BaseRegion", - "map": "TerMur", - "parent": "Royal City", - "logoutDelay": false, - "rects": [ + "$type": "BaseRegion", + "Name": "Royal City Inn", + "Map": "TerMur", + "Parent": "Royal City", + "LogoutDelay": false, + "Area": [ { "x1": 724, "y1": 3463, "x2": 761, "y2": 3483 }, { "x1": 747, "y1": 3480, "x2": 760, "y2": 3493 } ] }, { - "name": "Royal Park", - "type": "DungeonRegion", - "map": "TerMur", - "priority": 50, - "rects": [ + "$type": "DungeonRegion", + "Name": "Royal Park", + "Map": "TerMur", + "Priority": 50, + "Area": [ { "x1": 632, "y1": 3233, "x2": 808, "y2": 3268 }, { "x1": 753, "y1": 3161, "x2": 990, "y2": 3292 } ], - "go": { "x": 711, "y": 3255, "z": -42 } + "GoLocation": { "x": 711, "y": 3255, "z": -42 } }, { - "name": "Slith Valley", - "type": "DungeonRegion", - "map": "TerMur", - "priority": 50, - "rects": [{ "x1": 1028, "y1": 3263, "x2": 1221, "y2": 3404 }], - "go": { "x": 1078, "y": 3331, "z": -42 } + "$type": "DungeonRegion", + "Name": "Slith Valley", + "Map": "TerMur", + "Priority": 50, + "Area": [{ "x1": 1028, "y1": 3263, "x2": 1221, "y2": 3404 }], + "GoLocation": { "x": 1078, "y": 3331, "z": -42 } }, { - "name": "Spider Island", - "type": "DungeonRegion", - "map": "TerMur", - "priority": 50, - "rects": [{ "x1": 1063, "y1": 3695, "x2": 1181, "y2": 3779 }], - "go": { "x": 1115, "y": 3730, "z": -42 } + "$type": "DungeonRegion", + "Name": "Spider Island", + "Map": "TerMur", + "Priority": 50, + "Area": [{ "x1": 1063, "y1": 3695, "x2": 1181, "y2": 3779 }], + "GoLocation": { "x": 1115, "y": 3730, "z": -42 } }, { - "name": "StygianDragonLair", - "type": "DungeonRegion", - "map": "TerMur", - "priority": 50, - "music": "StygianDragon", - "rects": [{ "x1": 258, "y1": 90, "x2": 489, "y2": 245 }], - "go": { "x": 367, "y": 155, "z": 0 } + "$type": "DungeonRegion", + "Name": "StygianDragonLair", + "Map": "TerMur", + "Priority": 50, + "Music": "StygianDragon", + "Area": [{ "x1": 258, "y1": 90, "x2": 489, "y2": 245 }], + "GoLocation": { "x": 367, "y": 155, "z": 0 } }, { - "name": "Talon Point", - "type": "DungeonRegion", - "map": "TerMur", - "priority": 50, - "rects": [ + "$type": "DungeonRegion", + "Name": "Talon Point", + "Map": "TerMur", + "Priority": 50, + "Area": [ { "x1": 632, "y1": 3830, "x2": 730, "y2": 3885 }, { "x1": 629, "y1": 3786, "x2": 705, "y2": 3826 }, { "x1": 656, "y1": 3750, "x2": 707, "y2": 3791 } ], - "go": { "x": 676, "y": 3831, "z": -39 } + "GoLocation": { "x": 676, "y": 3831, "z": -39 } }, { - "name": "Toxic Desert", - "type": "DungeonRegion", - "map": "TerMur", - "priority": 50, + "$type": "DungeonRegion", + "Name": "Toxic Desert", + "Map": "TerMur", + "Priority": 50, "rune": "Toxic Desert", - "rects": [{ "x1": 1010, "y1": 2929, "z1": 37, "x2": 1156, "y2": 3049, "z2": 128 }], - "go": { "x": 1047, "y": 2980, "z": 62 }, - "entrance": { "x": 1051, "y": 3022 } + "Area": [{ "x1": 1010, "y1": 2929, "z1": 37, "x2": 1156, "y2": 3049, "z2": 128 }], + "GoLocation": { "x": 1047, "y": 2980, "z": 62 }, + "Entrance": { "x": 1051, "y": 3022 } }, { - "name": "Void Island", - "type": "DungeonRegion", - "map": "TerMur", - "priority": 50, - "rects": [{ "x1": 314, "y1": 3473, "x2": 581, "y2": 3699 }], - "go": { "x": 440, "y": 3577, "z": 38 } + "$type": "DungeonRegion", + "Name": "Void Island", + "Map": "TerMur", + "Priority": 50, + "Area": [{ "x1": 314, "y1": 3473, "x2": 581, "y2": 3699 }], + "GoLocation": { "x": 440, "y": 3577, "z": 38 } }, { - "name": "Volcano", - "type": "DungeonRegion", - "map": "TerMur", - "priority": 50, - "rects": [{ "x1": 298, "y1": 2895, "x2": 499, "y2": 3117 }], - "go": { "x": 407, "y": 3010, "z": -24 } + "$type": "DungeonRegion", + "Name": "Volcano", + "Map": "TerMur", + "Priority": 50, + "Area": [{ "x1": 298, "y1": 2895, "x2": 499, "y2": 3117 }], + "GoLocation": { "x": 407, "y": 3010, "z": -24 } }, { - "name": "Walled Circus", - "type": "DungeonRegion", - "map": "TerMur", - "priority": 50, - "rects": [{ "x1": 291, "y1": 3207, "x2": 445, "y2": 3354 }], - "go": { "x": 370, "y": 3273, "z": 0 } + "$type": "DungeonRegion", + "Name": "Walled Circus", + "Map": "TerMur", + "Priority": 50, + "Area": [{ "x1": 291, "y1": 3207, "x2": 445, "y2": 3354 }], + "GoLocation": { "x": 370, "y": 3273, "z": 0 } }, { - "name": "Waterfall Point", - "type": "DungeonRegion", - "map": "TerMur", - "priority": 50, - "rects": [{ "x1": 635, "y1": 2862, "x2": 731, "y2": 2926 }], - "go": { "x": 661, "y": 2894, "z": 39 } + "$type": "DungeonRegion", + "Name": "Waterfall Point", + "Map": "TerMur", + "Priority": 50, + "Area": [{ "x1": 635, "y1": 2862, "x2": 731, "y2": 2926 }], + "GoLocation": { "x": 661, "y": 2894, "z": 39 } }, { - "name": "Shrine of Singularity", - "type": "BaseRegion", - "map": "TerMur", - "priority": 50, - "music": "CodexShrine", - "rects": [{ "x1": 978, "y1": 3786, "x2": 1018, "y2": 3838 }], - "go": { "x": 995, "y": 3806, "z": 0 } + "$type": "BaseRegion", + "Name": "Shrine of Singularity", + "Map": "TerMur", + "Priority": 50, + "Music": "CodexShrine", + "Area": [{ "x1": 978, "y1": 3786, "x2": 1018, "y2": 3838 }], + "GoLocation": { "x": 995, "y": 3806, "z": 0 } }, { - "name": "GreatApeLair", - "type": "DungeonRegion", - "map": "TerMur", - "priority": 100, - "rects": [{ "x1": 832, "y1": 1363, "z1": -25, "x2": 938, "y2": 1474, "z2": 128 }], - "go": { "x": 926, "y": 1464, "z": 0 } + "$type": "DungeonRegion", + "Name": "GreatApeLair", + "Map": "TerMur", + "Priority": 100, + "Area": [{ "x1": 832, "y1": 1363, "z1": -25, "x2": 938, "y2": 1474, "z2": 128 }], + "GoLocation": { "x": 926, "y": 1464, "z": 0 } }, { - "name": "ZipactriotlLair", - "type": "DungeonRegion", - "map": "TerMur", - "priority": 100, - "rects": [{ "x1": 831, "y1": 2239, "z1": -25, "x2": 959, "y2": 2367, "z2": 128 }], - "go": { "x": 896, "y": 2304, "z": -19 } + "$type": "DungeonRegion", + "Name": "ZipactriotlLair", + "Map": "TerMur", + "Priority": 100, + "Area": [{ "x1": 831, "y1": 2239, "z1": -25, "x2": 959, "y2": 2367, "z2": 128 }], + "GoLocation": { "x": 896, "y": 2304, "z": -19 } }, { - "name": "MyrmidexQueenLair", - "type": "DungeonRegion", - "map": "TerMur", - "priority": 100, - "rects": [{ "x1": 704, "y1": 2248, "z1": -25, "x2": 828, "y2": 2363, "z2": 128 }], - "go": { "x": 766, "y": 2306, "z": 0 } + "$type": "DungeonRegion", + "Name": "MyrmidexQueenLair", + "Map": "TerMur", + "Priority": 100, + "Area": [{ "x1": 704, "y1": 2248, "z1": -25, "x2": 828, "y2": 2363, "z2": 128 }], + "GoLocation": { "x": 766, "y": 2306, "z": 0 } }, { - "name": "KotlCity", - "type": "DungeonRegion", - "map": "TerMur", - "priority": 50, - "rects": [{ "x1": 435, "y1": 2270, "z1": -25, "x2": 675, "y2": 2490, "z2": 128 }], - "go": { "x": 542, "y": 2473, "z": 0 } + "$type": "DungeonRegion", + "Name": "KotlCity", + "Map": "TerMur", + "Priority": 50, + "Area": [{ "x1": 435, "y1": 2270, "z1": -25, "x2": 675, "y2": 2490, "z2": 128 }], + "GoLocation": { "x": 542, "y": 2473, "z": 0 } } ] diff --git a/Projects/Server/Json/Converters/JsonDtoConverter.cs b/Projects/Server/Json/Converters/JsonDtoConverter.cs deleted file mode 100644 index c3b7f30a1..000000000 --- a/Projects/Server/Json/Converters/JsonDtoConverter.cs +++ /dev/null @@ -1,46 +0,0 @@ -/************************************************************************* - * ModernUO * - * Copyright 2019-2022 - ModernUO Development Team * - * Email: hi@modernuo.com * - * File: JsonDtoConverter.cs * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *************************************************************************/ - -using System; -using System.Text.Json; -using System.Text.Json.Serialization; - -namespace Server.Json; - -public class JsonDtoConverter : JsonConverter - where TDto : IJsonRootDtoConvertible, new() where TObject : new() -{ - public override TObject Read( - ref Utf8JsonReader reader, - Type typeToConvert, - JsonSerializerOptions options - ) - { - if (typeof(TObject) != typeToConvert) - { - throw new JsonException($"Invalid object type to deserialize for '{typeof(TObject).Name}'"); - } - - // Deserialize to the DTO - var dto = JsonSerializer.Deserialize(ref reader, options); - - return TDto.ToObject(dto); - } - - public override void Write(Utf8JsonWriter writer, TObject value, JsonSerializerOptions options) - { - JsonSerializer.Serialize(writer, TDto.FromObject(value), options); - } -} diff --git a/Projects/Server/Json/Converters/JsonDtoConverterFactory.cs b/Projects/Server/Json/Converters/JsonDtoConverterFactory.cs deleted file mode 100644 index 6d5b9f96c..000000000 --- a/Projects/Server/Json/Converters/JsonDtoConverterFactory.cs +++ /dev/null @@ -1,29 +0,0 @@ -/************************************************************************* - * ModernUO * - * Copyright 2019-2022 - ModernUO Development Team * - * Email: hi@modernuo.com * - * File: JsonDtoConverter.cs * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *************************************************************************/ - -using System; -using System.Text.Json; -using System.Text.Json.Serialization; - -namespace Server.Json; - -public class JsonDtoConverterFactory : JsonConverterFactory - where TDto : IJsonRootDtoConvertible, new() where TObject : new() -{ - public override bool CanConvert(Type typeToConvert) => typeToConvert == typeof(TObject); - - public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options) => - new JsonDtoConverter(); -} diff --git a/Projects/Server/Json/Converters/WorldLocationConverter.cs b/Projects/Server/Json/Converters/WorldLocationConverter.cs index 6cf4ad042..a994d1c5c 100644 --- a/Projects/Server/Json/Converters/WorldLocationConverter.cs +++ b/Projects/Server/Json/Converters/WorldLocationConverter.cs @@ -80,7 +80,6 @@ public class WorldLocationConverter : JsonConverter private WorldLocation DeserializeObj(ref Utf8JsonReader reader, JsonSerializerOptions options) { Span data = stackalloc int[3]; - var count = 0; var hasLoc = false; var hasXYZ = false; var hasMap = false; @@ -150,7 +149,6 @@ public class WorldLocationConverter : JsonConverter data[0] = loc.X; data[1] = loc.Y; data[2] = loc.Z; - count = 3; continue; } @@ -160,7 +158,7 @@ public class WorldLocationConverter : JsonConverter hasMap = true; } - if (!hasMap || count != 3) + if (!hasMap) { throw new JsonException("WorldLocation must have an x, y, z, and map properties"); } diff --git a/Projects/Server/Json/IJsonConvertible.cs b/Projects/Server/Json/IJsonConvertible.cs deleted file mode 100644 index 258eafcc9..000000000 --- a/Projects/Server/Json/IJsonConvertible.cs +++ /dev/null @@ -1,28 +0,0 @@ -/************************************************************************* - * ModernUO * - * Copyright 2019-2022 - ModernUO Development Team * - * Email: hi@modernuo.com * - * File: IJsonConvertible.cs * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *************************************************************************/ - -namespace Server.Json; - -public interface IJsonRootDtoConvertible where TSelf : IJsonRootDtoConvertible where TObject : new() -{ - public abstract static TSelf FromObject(TObject obj); - public abstract static TObject ToObject(TSelf obj); -} - -public interface IJsonDtoConvertible where TSelf : IJsonDtoConvertible where TObject : new() -{ - public abstract TSelf HydrateDto(TObject obj); - public abstract TObject HydrateObject(TObject obj); -} diff --git a/Projects/Server/Main.cs b/Projects/Server/Main.cs index f37eb5269..7e21454e8 100644 --- a/Projects/Server/Main.cs +++ b/Projects/Server/Main.cs @@ -19,7 +19,6 @@ using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; -using System.Runtime; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; @@ -509,7 +508,7 @@ public static class Core TileMatrixLoader.LoadTileMatrix(); - RegionLoader.LoadRegions(); + RegionJsonSerializer.LoadRegions(); World.Load(); AssemblyHandler.Invoke("Initialize"); diff --git a/Projects/Server/Regions/Region.cs b/Projects/Server/Regions/Region.cs index a177751f5..16ff947f0 100644 --- a/Projects/Server/Regions/Region.cs +++ b/Projects/Server/Regions/Region.cs @@ -1,7 +1,5 @@ using System; using System.Collections.Generic; -using System.Text.Json; -using Server.Json; using Server.Logging; using Server.Network; using Server.Targeting; @@ -78,6 +76,42 @@ public enum MusicName SelimsBar, SerpentIsleCombat_U7, ValoriaShips, + TheWanderer, + Castle, + Festival, + Honor, + Medieval, + BattleOnStones, + Docktown, + GargoyleQueen, + GenericCombat, + Holycity, + HumanLevel, + LoginLoop, + NorthernForestBattleonStones, + PrimevalLich, + QueenPalace, + RoyalCity, + SlasherVeil, + StygianAbyss, + StygianDragon, + Void, + CodexShrine, + AnvilStrikeInMinoc, + ASkaranLullaby, + BlackthornsMarch, + DupresNightInTrinsic, + FayaxionAndTheSix, + FlightOfTheNexus, + GalehavenJaunt, + JhelomToArms, + MidnightInYew, + MoonglowSonata, + NewMaginciaMarch, + NujelmWaltz, + SherrysSong, + StarlightInBritain, + TheVesperMist, NoMusic = 0x1FFF } @@ -98,9 +132,16 @@ public class Region : IComparable { } + public Region(string name, Map map, params Rectangle3D[] area) : this(name, map, null, area) + { + } + public Region(string name, Map map, int priority, params Rectangle3D[] area) : this(name, map, null, area) => Priority = priority; + public Region(string name, Map map, Region parent, int priority, params Rectangle3D[] area) : this(name, map, parent, area) => + Priority = priority; + public Region(string name, Map map, Region parent, params Rectangle2D[] area) : this( name, map, @@ -131,54 +172,6 @@ public class Region : IComparable } } - public Region(DynamicJson json, JsonSerializerOptions options) - { - Map = json.GetProperty("map", options, out Map map) ? map : null; - Parent = json.GetProperty("parent", options, out string parent) ? Find(parent, Map) : null; - Name = json.GetProperty("name", options, out string name) ? name : null; - - Dynamic = false; - - if (Parent == null) - { - ChildLevel = 0; - Priority = DefaultPriority; - } - else - { - ChildLevel = Parent.ChildLevel + 1; - Priority = Parent.Priority; - } - - Priority = json.GetProperty("priority", options, out int priority) ? priority : Priority; - - Area = json.GetProperty("rects", options, out List rects) - ? rects.ToArray() - : Array.Empty(); - - if (Area.Length == 0) - { - logger.Debug("Empty area for region '{Region}'", this); - } - - if (json.GetProperty("go", options, out Point3D go)) - { - GoLocation = go; - } - else if (Area.Length > 0) - { - var start = Area[0].Start; - var end = Area[0].End; - - var x = start.X + (end.X - start.X) / 2; - var y = start.Y + (end.Y - start.Y) / 2; - - GoLocation = new Point3D(x, y, Map?.GetAverageZ(x, y) ?? start.Z + (end.Z - start.Z) / 2); - } - - Music = json.GetEnumProperty("music", options, out MusicName music) ? music : DefaultMusic; - } - public static List Regions { get; } = new(); public static TimeSpan StaffLogoutDelay { get; set; } = TimeSpan.Zero; @@ -239,6 +232,11 @@ public class Region : IComparable // This is not optimized. Use sparingly public static Region Find(string name, Map map, bool insensitive = false) { + if (string.IsNullOrWhiteSpace(name)) + { + return null; + } + if (insensitive) { name = name.ToLower(); diff --git a/Projects/Server/Regions/RegionJsonDto.cs b/Projects/Server/Regions/RegionJsonDto.cs new file mode 100644 index 000000000..21aaec107 --- /dev/null +++ b/Projects/Server/Regions/RegionJsonDto.cs @@ -0,0 +1,61 @@ +/************************************************************************* + * ModernUO * + * Copyright 2019-2022 - ModernUO Development Team * + * Email: hi@modernuo.com * + * File: RegionJsonDto.cs * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + *************************************************************************/ + +using System; +using System.Text.Json.Serialization; +using Server.Utilities; + +namespace Server; + +public class RegionJsonDto +{ + [JsonIgnore] + public virtual Type RegionType => typeof(Region); + + public Map Map { get; set; } + public string? Parent { get; set; } + public string Name { get; set; } + public int? Priority { get; set; } + public Rectangle3D[] Area { get; set; } + public Point3D GoLocation { get; set; } + public MusicName? Music { get; set; } + + public virtual void FromRegion(Region region) + { + Map = region.Map; + Parent = region.Parent?.Name; + Name = region.Name; + Priority = region.Priority; + Area = region.Area; + GoLocation = region.GoLocation; + Music = region.Music != region.DefaultMusic ? region.Music : null; + } + + public Region ToRegion() + { + var region = Priority != null + ? RegionType.CreateInstance(Name, Map, Region.Find(Parent, Map), Priority, Area) + : RegionType.CreateInstance(Name, Map, Region.Find(Parent, Map), Area); + + HydrateRegion(region); + return region; + } + + protected virtual void HydrateRegion(Region region) + { + region.GoLocation = GoLocation; + region.Music = Music ?? region.DefaultMusic; + } +} diff --git a/Projects/Server/Regions/RegionJsonSerializer.cs b/Projects/Server/Regions/RegionJsonSerializer.cs new file mode 100644 index 000000000..f8f99e6cd --- /dev/null +++ b/Projects/Server/Regions/RegionJsonSerializer.cs @@ -0,0 +1,148 @@ +/************************************************************************* + * ModernUO * + * Copyright 2019-2022 - ModernUO Development Team * + * Email: hi@modernuo.com * + * File: RegionJsonSerializer.cs * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + *************************************************************************/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text.Json; +using System.Text.Json.Serialization; +using System.Text.Json.Serialization.Metadata; +using Server.Json; +using Server.Logging; +using Server.Utilities; + +namespace Server; + +public static class RegionJsonSerializer +{ + private static readonly ILogger logger = LogFactory.GetLogger(typeof(RegionJsonSerializer)); + + // Note: This is filled during the `Configure` phase by RegisterRegionForSerialization, + // so it is not available to a JsonConverter which might be used during earlier phases. + private static Dictionary _regionToDtoLookup = new() { { typeof(Region), typeof(RegionJsonDto) } }; + private static JsonDerivedType[] _derivedTypes = { new(typeof(RegionJsonDto), nameof(Region)) }; + + private static JsonSerializerOptions _options = new(JsonConfig.DefaultOptions) + { + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault, + TypeInfoResolver = new DefaultJsonTypeInfoResolver + { + Modifiers = + { + static typeInfo => + { + if (typeInfo.Type != typeof(RegionJsonDto)) + { + return; + } + + typeInfo.PolymorphismOptions = new JsonPolymorphismOptions(); + for (var i = 0; i < _derivedTypes.Length; i++) + { + typeInfo.PolymorphismOptions.DerivedTypes.Add(_derivedTypes[i]); + } + }, + } + } + }; + + public static void RegisterRegionForSerialization() + where TDto : RegionJsonDto, new() where TRegion : Region + { + for (var i = 0; i < _derivedTypes.Length; i++) + { + if (_derivedTypes[i].DerivedType == typeof(TDto)) + { + throw new Exception( + $"Type '{typeof(TDto)}' has already been registered for serialization with the region loader." + ); + } + } + + Array.Resize(ref _derivedTypes, _derivedTypes.Length + 1); + _derivedTypes[^1] = new JsonDerivedType(typeof(TDto), typeof(TRegion).Name); + _regionToDtoLookup[typeof(TRegion)] = typeof(TDto); + } + + internal static void LoadRegions() + { + var path = Path.Join(Core.BaseDirectory, "Data/regions.json"); + + logger.Information("Loading regions"); + + var stopwatch = Stopwatch.StartNew(); + + var regions = JsonConfig.Deserialize>(path, _options); + if (regions == null) + { + throw new JsonException($"Failed to deserialize {path}."); + } + + foreach (var dto in regions) + { + var region = dto.ToRegion(); + region.Register(); + } + + stopwatch.Stop(); + + logger.Information( + "Loading regions {Status} ({Count} regions) ({Duration:F2} seconds)", + "done", + regions.Count, + stopwatch.Elapsed.TotalSeconds + ); + } + + // Note: This is not thread safe. To make `SerializeRegions` threadsafe, use `[ThreadStatic]` or just create the lists + // in the function and take the GC hit. + private static List _regionJsonDtos; + + public static void SerializeRegions(string path, IEnumerable regions) + { + _regionJsonDtos ??= new List(); + foreach (var region in regions) + { + if (_regionToDtoLookup.TryGetValue(region.GetType(), out var dtoType)) + { + var dto = dtoType.CreateInstance(); + dto.FromRegion(region); + _regionJsonDtos.Add(dto); + } + } + + JsonConfig.Serialize(path, _regionJsonDtos, _options); + _regionJsonDtos.Clear(); + } + + public static string SerializeRegions(IEnumerable regions) + { + _regionJsonDtos ??= new List(); + foreach (var region in regions) + { + if (_regionToDtoLookup.TryGetValue(region.GetType(), out var dtoType)) + { + var dto = dtoType.CreateInstance(); + dto.FromRegion(region); + _regionJsonDtos.Add(dto); + } + } + + var output = JsonConfig.Serialize(_regionJsonDtos, _options); + _regionJsonDtos.Clear(); + return output; + } +} diff --git a/Projects/Server/Regions/RegionLoader.cs b/Projects/Server/Regions/RegionLoader.cs deleted file mode 100644 index 177abb17d..000000000 --- a/Projects/Server/Regions/RegionLoader.cs +++ /dev/null @@ -1,86 +0,0 @@ -/************************************************************************* - * ModernUO * - * Copyright 2019-2022 - ModernUO Development Team * - * Email: hi@modernuo.com * - * File: RegionLoader.cs * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *************************************************************************/ - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Text.Json; -using Server.Json; -using Server.Logging; -using Server.Utilities; - -namespace Server; - -internal static class RegionLoader -{ - private static readonly ILogger logger = LogFactory.GetLogger(typeof(RegionLoader)); - - internal static void LoadRegions() - { - var path = Path.Join(Core.BaseDirectory, "Data/regions.json"); - - var failures = new List(); - var count = 0; - - logger.Information("Loading regions"); - - var stopwatch = Stopwatch.StartNew(); - var regions = JsonConfig.Deserialize>(path); - if (regions == null) - { - throw new JsonException($"Failed to deserialize {path}."); - } - - foreach (var json in regions) - { - var type = AssemblyHandler.FindTypeByName(json.Type); - - if (type == null || !typeof(Region).IsAssignableFrom(type)) - { - failures.Add($"\tInvalid region type {json.Type}"); - continue; - } - - var region = type.CreateInstance(json, JsonConfig.DefaultOptions); - region?.Register(); - count++; - } - - stopwatch.Stop(); - - if (failures.Count == 0) - { - logger.Information( - "Loading regions {Status} ({Count} regions, {FailureCount} failures) ({Duration:F2} seconds)", - "done", - count, - failures.Count, - stopwatch.Elapsed.TotalSeconds - ); - } - else - { - logger.Warning( - $"Loading regions {{Status}} ({{Count}} regions, {{FailureCount}} failures) ({{Duration:F2}} seconds){Environment.NewLine}{{Failures}}", - "failed", - count, - failures.Count, - stopwatch.Elapsed.TotalSeconds, - failures - ); - } - } -} diff --git a/Projects/UOContent/Commands/Handlers.cs b/Projects/UOContent/Commands/Handlers.cs index 811bacff9..34253d7cf 100644 --- a/Projects/UOContent/Commands/Handlers.cs +++ b/Projects/UOContent/Commands/Handlers.cs @@ -109,7 +109,7 @@ namespace Server.Commands if (map != null) { - var reg = from.Region; + var reg = Region.Find(from.Location, from.Map); if (!reg.IsDefault) { diff --git a/Projects/UOContent/Engines/ConPVP/Arena.cs b/Projects/UOContent/Engines/ConPVP/Arena.cs index 6b099c578..aebfed7b0 100644 --- a/Projects/UOContent/Engines/ConPVP/Arena.cs +++ b/Projects/UOContent/Engines/ConPVP/Arena.cs @@ -355,7 +355,7 @@ namespace Server.Engines.ConPVP if (m_Region != null) { - m_Region.Disabled = !m_IsGuarded; + m_Region.GuardsDisabled = !m_IsGuarded; } } } diff --git a/Projects/UOContent/Engines/ConPVP/SafeZone.cs b/Projects/UOContent/Engines/ConPVP/SafeZone.cs index ca4b5ac24..69ba11a66 100644 --- a/Projects/UOContent/Engines/ConPVP/SafeZone.cs +++ b/Projects/UOContent/Engines/ConPVP/SafeZone.cs @@ -14,7 +14,7 @@ namespace Server.Engines.ConPVP { GoLocation = goloc; - Disabled = !isGuarded; + GuardsDisabled = !isGuarded; Register(); } diff --git a/Projects/UOContent/Mobiles/PlayerMobile.cs b/Projects/UOContent/Mobiles/PlayerMobile.cs index bd2ecd665..59ef697d4 100644 --- a/Projects/UOContent/Mobiles/PlayerMobile.cs +++ b/Projects/UOContent/Mobiles/PlayerMobile.cs @@ -4416,10 +4416,10 @@ namespace Server.Mobiles Map map; var dungeon = Region.GetRegion(); - if (dungeon != null && dungeon.EntranceLocation != Point3D.Zero) + if (dungeon != null && dungeon.Entrance != Point3D.Zero) { - loc = dungeon.EntranceLocation; - map = dungeon.EntranceMap; + loc = dungeon.Entrance; + map = dungeon.Map; } else { diff --git a/Projects/UOContent/Regions/BaseRegion.cs b/Projects/UOContent/Regions/BaseRegion.cs index 41e73a5cc..f3e7873a8 100644 --- a/Projects/UOContent/Regions/BaseRegion.cs +++ b/Projects/UOContent/Regions/BaseRegion.cs @@ -1,178 +1,170 @@ using System; using System.Collections.Generic; -using System.Text.Json; using Server.Gumps; -using Server.Json; using Server.Mobiles; using Server.Spells; -namespace Server.Regions +namespace Server.Regions; + +public class BaseRegion : Region { - public class BaseRegion : Region + private static readonly List m_RectBuffer1 = new(); + private static readonly List m_RectBuffer2 = new(); + + public BaseRegion(string name, Map map, int priority, params Rectangle2D[] area) : base(name, map, priority, area) { - private static readonly List m_RectBuffer1 = new(); - private static readonly List m_RectBuffer2 = new(); + } - public BaseRegion(string name, Map map, int priority, params Rectangle2D[] area) : base(name, map, priority, area) - { - } + public BaseRegion(string name, Map map, int priority, params Rectangle3D[] area) : base(name, map, priority, area) + { + } - public BaseRegion(string name, Map map, int priority, params Rectangle3D[] area) : base(name, map, priority, area) - { - } + public BaseRegion(string name, Map map, Region parent, int priority, params Rectangle3D[] area) + : base(name, map, parent, priority, area) + { + } - public BaseRegion(string name, Map map, Region parent, params Rectangle2D[] area) : base(name, map, parent, area) - { - } + public BaseRegion(string name, Map map, Region parent, params Rectangle2D[] area) : base(name, map, parent, area) + { + } - public BaseRegion(string name, Map map, Region parent, params Rectangle3D[] area) : base(name, map, parent, area) - { - } + public BaseRegion(string name, Map map, Region parent, params Rectangle3D[] area) : base(name, map, parent, area) + { + } - public BaseRegion(DynamicJson json, JsonSerializerOptions options) : base(json, options) + public bool ExcludeFromParentSpawns { get; set; } + + public Rectangle3D[] Rectangles { get; private set; } + public int[] RectangleWeights { get; private set; } + public int TotalWeight { get; private set; } + + public virtual bool YoungProtected => true; + public virtual bool YoungMayEnter => true; + public virtual bool MountsAllowed => true; + public virtual bool DeadMayEnter => true; + public virtual bool ResurrectionAllowed => true; + public virtual bool LogoutAllowed => true; + + public string RuneName { get; set; } + + public bool NoLogoutDelay { get; set; } + + public static string GetRuneNameFor(Region region) + { + while (region != null) { - if (json.GetProperty("rune", options, out var runeName)) + var br = region as BaseRegion; + + if (br?.RuneName != null) { - RuneName = runeName; + return br.RuneName; } - NoLogoutDelay = json.GetProperty("logoutDelay", options, out var logoutDelay) && !logoutDelay; + region = region.Parent; } - public bool ExcludeFromParentSpawns { get; set; } + return null; + } - public Rectangle3D[] Rectangles { get; private set; } - public int[] RectangleWeights { get; private set; } - public int TotalWeight { get; private set; } + public override TimeSpan GetLogoutDelay(Mobile m) => + NoLogoutDelay && m.Aggressors.Count == 0 && m.Aggressed.Count == 0 && !m.Criminal + ? TimeSpan.Zero + : base.GetLogoutDelay(m); - public virtual bool YoungProtected => true; - public virtual bool YoungMayEnter => true; - public virtual bool MountsAllowed => true; - public virtual bool DeadMayEnter => true; - public virtual bool ResurrectionAllowed => true; - public virtual bool LogoutAllowed => true; - - public string RuneName { get; set; } - - public bool NoLogoutDelay { get; set; } - - public static string GetRuneNameFor(Region region) + public override void OnEnter(Mobile m) + { + if (m is PlayerMobile mobile && mobile.Young && !YoungProtected) { - while (region != null) - { - var br = region as BaseRegion; + mobile.SendGump(new YoungDungeonWarning()); + } + } - if (br?.RuneName != null) + public override bool AcceptsSpawnsFrom(Region region) => + (region == this || !ExcludeFromParentSpawns) && base.AcceptsSpawnsFrom(region); + + // TODO: Clean this up + public void InitRectangles() + { + if (Rectangles != null) + { + return; + } + + // Test if area rectangles are overlapping, and in that case break them into smaller non overlapping rectangles + for (var i = 0; i < Area.Length; i++) + { + m_RectBuffer2.Add(Area[i]); + + for (var j = 0; j < m_RectBuffer1.Count && m_RectBuffer2.Count > 0; j++) + { + var comp = m_RectBuffer1[j]; + + for (var k = m_RectBuffer2.Count - 1; k >= 0; k--) { - return br.RuneName; - } + var rect = m_RectBuffer2[k]; - region = region.Parent; - } + int l1 = rect.Start.X, r1 = rect.End.X, t1 = rect.Start.Y, b1 = rect.End.Y; + int l2 = comp.Start.X, r2 = comp.End.X, t2 = comp.Start.Y, b2 = comp.End.Y; - return null; - } - - public override TimeSpan GetLogoutDelay(Mobile m) => - NoLogoutDelay && m.Aggressors.Count == 0 && m.Aggressed.Count == 0 && !m.Criminal - ? TimeSpan.Zero - : base.GetLogoutDelay(m); - - public override void OnEnter(Mobile m) - { - if (m is PlayerMobile mobile && mobile.Young && !YoungProtected) - { - mobile.SendGump(new YoungDungeonWarning()); - } - } - - public override bool AcceptsSpawnsFrom(Region region) => - (region == this || !ExcludeFromParentSpawns) && base.AcceptsSpawnsFrom(region); - - // TODO: Clean this up - public void InitRectangles() - { - if (Rectangles != null) - { - return; - } - - // Test if area rectangles are overlapping, and in that case break them into smaller non overlapping rectangles - for (var i = 0; i < Area.Length; i++) - { - m_RectBuffer2.Add(Area[i]); - - for (var j = 0; j < m_RectBuffer1.Count && m_RectBuffer2.Count > 0; j++) - { - var comp = m_RectBuffer1[j]; - - for (var k = m_RectBuffer2.Count - 1; k >= 0; k--) + if (l1 < r2 && r1 > l2 && t1 < b2 && b1 > t2) { - var rect = m_RectBuffer2[k]; + m_RectBuffer2.RemoveAt(k); - int l1 = rect.Start.X, r1 = rect.End.X, t1 = rect.Start.Y, b1 = rect.End.Y; - int l2 = comp.Start.X, r2 = comp.End.X, t2 = comp.Start.Y, b2 = comp.End.Y; + var sz = rect.Start.Z; + var ez = rect.End.X; - if (l1 < r2 && r1 > l2 && t1 < b2 && b1 > t2) + if (l1 < l2) { - m_RectBuffer2.RemoveAt(k); + m_RectBuffer2.Add(new Rectangle3D(new Point3D(l1, t1, sz), new Point3D(l2, b1, ez))); + } - var sz = rect.Start.Z; - var ez = rect.End.X; + if (r1 > r2) + { + m_RectBuffer2.Add(new Rectangle3D(new Point3D(r2, t1, sz), new Point3D(r1, b1, ez))); + } - if (l1 < l2) - { - m_RectBuffer2.Add(new Rectangle3D(new Point3D(l1, t1, sz), new Point3D(l2, b1, ez))); - } + if (t1 < t2) + { + m_RectBuffer2.Add( + new Rectangle3D( + new Point3D(Math.Max(l1, l2), t1, sz), + new Point3D(Math.Min(r1, r2), t2, ez) + ) + ); + } - if (r1 > r2) - { - m_RectBuffer2.Add(new Rectangle3D(new Point3D(r2, t1, sz), new Point3D(r1, b1, ez))); - } - - if (t1 < t2) - { - m_RectBuffer2.Add( - new Rectangle3D( - new Point3D(Math.Max(l1, l2), t1, sz), - new Point3D(Math.Min(r1, r2), t2, ez) - ) - ); - } - - if (b1 > b2) - { - m_RectBuffer2.Add( - new Rectangle3D( - new Point3D(Math.Max(l1, l2), b2, sz), - new Point3D(Math.Min(r1, r2), b1, ez) - ) - ); - } + if (b1 > b2) + { + m_RectBuffer2.Add( + new Rectangle3D( + new Point3D(Math.Max(l1, l2), b2, sz), + new Point3D(Math.Min(r1, r2), b1, ez) + ) + ); } } } - - m_RectBuffer1.AddRange(m_RectBuffer2); - m_RectBuffer2.Clear(); } - Rectangles = m_RectBuffer1.ToArray(); - m_RectBuffer1.Clear(); - - RectangleWeights = new int[Rectangles.Length]; - for (var i = 0; i < Rectangles.Length; i++) - { - var rect = Rectangles[i]; - var weight = rect.Width * rect.Height; - - RectangleWeights[i] = weight; - TotalWeight += weight; - } + m_RectBuffer1.AddRange(m_RectBuffer2); + m_RectBuffer2.Clear(); } - public override string ToString() => Name ?? RuneName ?? GetType().Name; + Rectangles = m_RectBuffer1.ToArray(); + m_RectBuffer1.Clear(); - public virtual bool CheckTravel(Mobile m, Point3D newLocation, TravelCheckType travelType) => true; + RectangleWeights = new int[Rectangles.Length]; + for (var i = 0; i < Rectangles.Length; i++) + { + var rect = Rectangles[i]; + var weight = rect.Width * rect.Height; + + RectangleWeights[i] = weight; + TotalWeight += weight; + } } + + public override string ToString() => Name ?? RuneName ?? GetType().Name; + + public virtual bool CheckTravel(Mobile m, Point3D newLocation, TravelCheckType travelType) => true; } diff --git a/Projects/UOContent/Regions/DungeonRegion.cs b/Projects/UOContent/Regions/DungeonRegion.cs index 657ae4ef1..c930ce285 100644 --- a/Projects/UOContent/Regions/DungeonRegion.cs +++ b/Projects/UOContent/Regions/DungeonRegion.cs @@ -1,36 +1,26 @@ -using System.Text.Json; -using Server.Json; +namespace Server.Regions; -namespace Server.Regions +public class DungeonRegion : BaseRegion { - public class DungeonRegion : BaseRegion + public DungeonRegion(string name, Map map, Region parent, params Rectangle3D[] area) : base(name, map, parent, area) { - public DungeonRegion(DynamicJson json, JsonSerializerOptions options) : base(json, options) - { - if (json.GetProperty("map", options, out Map map)) - { - EntranceMap = map; - } - - if (json.GetProperty("entrance", options, out Point3D entrance)) - { - EntranceLocation = entrance; - } - } - - public override bool YoungProtected => false; - - public Point3D EntranceLocation { get; set; } - - public Map EntranceMap { get; set; } - - public override bool AllowHousing(Mobile from, Point3D p) => false; - - public override void AlterLightLevel(Mobile m, ref int global, ref int personal) - { - global = LightCycle.DungeonLevel; - } - - public override bool CanUseStuckMenu(Mobile m) => Map != Map.Felucca && base.CanUseStuckMenu(m); } + + public DungeonRegion(string name, Map map, Region parent, int priority, params Rectangle3D[] area) + : base(name, map, parent, priority, area) + { + } + + public override bool YoungProtected => false; + + public Point3D Entrance { get; set; } + + public override bool AllowHousing(Mobile from, Point3D p) => false; + + public override void AlterLightLevel(Mobile m, ref int global, ref int personal) + { + global = LightCycle.DungeonLevel; + } + + public override bool CanUseStuckMenu(Mobile m) => Map != Map.Felucca && base.CanUseStuckMenu(m); } diff --git a/Projects/UOContent/Regions/GreenAcresRegion.cs b/Projects/UOContent/Regions/GreenAcresRegion.cs index c7b7fc985..c827032d8 100644 --- a/Projects/UOContent/Regions/GreenAcresRegion.cs +++ b/Projects/UOContent/Regions/GreenAcresRegion.cs @@ -1,31 +1,33 @@ -using System.Text.Json; -using Server.Json; using Server.Spells; using Server.Spells.Sixth; -namespace Server.Regions +namespace Server.Regions; + +public class GreenAcresRegion : BaseRegion { - public class GreenAcresRegion : BaseRegion + public GreenAcresRegion(string name, Map map, Region parent, params Rectangle3D[] area) : base(name, map, parent, area) { - public GreenAcresRegion(DynamicJson json, JsonSerializerOptions options) : base(json, options) + } + + public GreenAcresRegion(string name, Map map, Region parent, int priority, params Rectangle3D[] area) + : base(name, map, parent, priority, area) + { + } + + public override bool AllowHousing(Mobile from, Point3D p) => + from.AccessLevel != AccessLevel.Player && base.AllowHousing(from, p); + + public override bool CheckTravel(Mobile m, Point3D newLocation, TravelCheckType travelType) => + m.AccessLevel != AccessLevel.Player; + + public override bool OnBeginSpellCast(Mobile m, ISpell s) + { + if (m.AccessLevel == AccessLevel.Player && s is MarkSpell) { + m.SendLocalizedMessage(501802); // Thy spell doth not appear to work... + return false; } - public override bool AllowHousing(Mobile from, Point3D p) => - from.AccessLevel != AccessLevel.Player && base.AllowHousing(from, p); - - public override bool CheckTravel(Mobile m, Point3D newLocation, TravelCheckType travelType) => - m.AccessLevel != AccessLevel.Player; - - public override bool OnBeginSpellCast(Mobile m, ISpell s) - { - if (m.AccessLevel == AccessLevel.Player && s is MarkSpell) - { - m.SendLocalizedMessage(501802); // Thy spell doth not appear to work... - return false; - } - - return base.OnBeginSpellCast(m, s); - } + return base.OnBeginSpellCast(m, s); } } diff --git a/Projects/UOContent/Regions/GuardedRegion.cs b/Projects/UOContent/Regions/GuardedRegion.cs index dc1879ab5..0c2986539 100644 --- a/Projects/UOContent/Regions/GuardedRegion.cs +++ b/Projects/UOContent/Regions/GuardedRegion.cs @@ -1,131 +1,90 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text.Json; -using Server.Json; using Server.Logging; using Server.Mobiles; using Server.Utilities; -namespace Server.Regions +namespace Server.Regions; + +public class GuardedRegion : BaseRegion { - public class GuardedRegion : BaseRegion + private static readonly ILogger logger = LogFactory.GetLogger(typeof(GuardedRegion)); + + private static readonly object[] m_GuardParams = new object[1]; + + private readonly Dictionary m_GuardCandidates = new(); + + public GuardedRegion(string name, Map map, int priority, params Rectangle3D[] area) : + base(name, map, priority, area) => GuardType = DefaultGuardType; + + public GuardedRegion(string name, Map map, int priority, params Rectangle2D[] area) : + base(name, map, priority, area) => GuardType = DefaultGuardType; + + public GuardedRegion(string name, Map map, Region parent, params Rectangle3D[] area) : base(name, map, parent, area) => + GuardType = DefaultGuardType; + + public GuardedRegion(string name, Map map, Region parent, int priority, params Rectangle3D[] area) + : base(name, map, parent, priority, area) => GuardType = DefaultGuardType; + + public GuardedRegion(string name, Map map, Region parent, int priority, Type guardType, params Rectangle3D[] area) + : base(name, map, parent, priority, area) => GuardType = guardType ?? DefaultGuardType; + + public Type GuardType { get; set; } + + public bool GuardsDisabled { get; set; } + + public virtual bool AllowReds => Core.AOS; + + public virtual Type DefaultGuardType { - private static readonly ILogger logger = LogFactory.GetLogger(typeof(GuardedRegion)); - - private static readonly object[] m_GuardParams = new object[1]; - - private readonly Dictionary m_GuardCandidates = new(); - private readonly Type m_GuardType; - - public GuardedRegion(string name, Map map, int priority, params Rectangle3D[] area) : - base(name, map, priority, area) => - m_GuardType = DefaultGuardType; - - public GuardedRegion(string name, Map map, int priority, params Rectangle2D[] area) : - base(name, map, priority, area) => - m_GuardType = DefaultGuardType; - - public GuardedRegion(DynamicJson json, JsonSerializerOptions options) : base(json, options) + get { - if (json.GetProperty("guardsType", options, out string guardType)) + if (Map == Map.Ilshenar || Map == Map.Malas) { - m_GuardType = AssemblyHandler.FindTypeByName(guardType); - - if (!typeof(BaseGuard).IsAssignableFrom(m_GuardType)) - { - logger.Warning("Invalid guard type for region '{Region}'", this); - m_GuardType = DefaultGuardType; - } - } - else - { - m_GuardType = DefaultGuardType; + return typeof(ArcherGuard); } - Disabled = json.GetProperty("guardsDisabled", options, out bool disabled) && disabled; + return typeof(WarriorGuard); } + } - public bool Disabled { get; set; } + public virtual bool IsDisabled() => GuardsDisabled; - public virtual bool AllowReds => Core.AOS; + public static void Initialize() + { + CommandSystem.Register("CheckGuarded", AccessLevel.GameMaster, CheckGuarded_OnCommand); + CommandSystem.Register("SetGuarded", AccessLevel.Administrator, SetGuarded_OnCommand); + CommandSystem.Register("ToggleGuarded", AccessLevel.Administrator, ToggleGuarded_OnCommand); + } - public virtual Type DefaultGuardType + [Usage("CheckGuarded"), Description("Returns a value indicating if the current region is guarded or not.")] + private static void CheckGuarded_OnCommand(CommandEventArgs e) + { + var from = e.Mobile; + var reg = from.Region.GetRegion(); + + if (reg == null) { - get - { - if (Map == Map.Ilshenar || Map == Map.Malas) - { - return typeof(ArcherGuard); - } - - return typeof(WarriorGuard); - } + from.SendMessage("You are not in a guardable region."); } - - public virtual bool IsDisabled() => Disabled; - - public static void Initialize() + else if (reg.GuardsDisabled) { - CommandSystem.Register("CheckGuarded", AccessLevel.GameMaster, CheckGuarded_OnCommand); - CommandSystem.Register("SetGuarded", AccessLevel.Administrator, SetGuarded_OnCommand); - CommandSystem.Register("ToggleGuarded", AccessLevel.Administrator, ToggleGuarded_OnCommand); + from.SendMessage("The guards in this region have been disabled."); } - - [Usage("CheckGuarded"), Description("Returns a value indicating if the current region is guarded or not.")] - private static void CheckGuarded_OnCommand(CommandEventArgs e) + else { - var from = e.Mobile; - var reg = from.Region.GetRegion(); - - if (reg == null) - { - from.SendMessage("You are not in a guardable region."); - } - else if (reg.Disabled) - { - from.SendMessage("The guards in this region have been disabled."); - } - else - { - from.SendMessage("This region is actively guarded."); - } + from.SendMessage("This region is actively guarded."); } + } - [Usage("SetGuarded "), Description("Enables or disables guards for the current region.")] - private static void SetGuarded_OnCommand(CommandEventArgs e) + [Usage("SetGuarded "), Description("Enables or disables guards for the current region.")] + private static void SetGuarded_OnCommand(CommandEventArgs e) + { + var from = e.Mobile; + + if (e.Length == 1) { - var from = e.Mobile; - - if (e.Length == 1) - { - var reg = from.Region.GetRegion(); - - if (reg == null) - { - from.SendMessage("You are not in a guardable region."); - } - else - { - reg.Disabled = !e.GetBoolean(0); - - from.SendMessage( - reg.Disabled - ? "The guards in this region have been disabled." - : "The guards in this region have been enabled." - ); - } - } - else - { - from.SendMessage("Format: SetGuarded "); - } - } - - [Usage("ToggleGuarded"), Description("Toggles the state of guards for the current region.")] - private static void ToggleGuarded_OnCommand(CommandEventArgs e) - { - var from = e.Mobile; var reg = from.Region.GetRegion(); if (reg == null) @@ -134,252 +93,278 @@ namespace Server.Regions } else { - reg.Disabled = !reg.Disabled; + reg.GuardsDisabled = !e.GetBoolean(0); from.SendMessage( - reg.Disabled + reg.GuardsDisabled ? "The guards in this region have been disabled." : "The guards in this region have been enabled." ); } } - - public static GuardedRegion Disable(GuardedRegion reg) + else { - reg.Disabled = true; - return reg; + from.SendMessage("Format: SetGuarded "); + } + } + + [Usage("ToggleGuarded"), Description("Toggles the state of guards for the current region.")] + private static void ToggleGuarded_OnCommand(CommandEventArgs e) + { + var from = e.Mobile; + var reg = from.Region.GetRegion(); + + if (reg == null) + { + from.SendMessage("You are not in a guardable region."); + } + else + { + reg.GuardsDisabled = !reg.GuardsDisabled; + + from.SendMessage( + reg.GuardsDisabled + ? "The guards in this region have been disabled." + : "The guards in this region have been enabled." + ); + } + } + + public static GuardedRegion Disable(GuardedRegion reg) + { + reg.GuardsDisabled = true; + return reg; + } + + public virtual bool CheckVendorAccess(BaseVendor vendor, Mobile from) => + from.AccessLevel >= AccessLevel.GameMaster || IsDisabled() || from.Kills < 5; + + public override bool OnBeginSpellCast(Mobile m, ISpell s) + { + if (!IsDisabled() && !s.OnCastInTown(this)) + { + m.SendLocalizedMessage(500946); // You cannot cast this in town! + return false; } - public virtual bool CheckVendorAccess(BaseVendor vendor, Mobile from) => - from.AccessLevel >= AccessLevel.GameMaster || IsDisabled() || from.Kills < 5; + return base.OnBeginSpellCast(m, s); + } - public override bool OnBeginSpellCast(Mobile m, ISpell s) + public override bool AllowHousing(Mobile from, Point3D p) => false; + + public override void MakeGuard(Mobile focus) + { + var eable = focus.GetMobilesInRange(8); + var useGuard = eable.FirstOrDefault(m => m.Focus == null); + + eable.Free(); + + if (useGuard == null) { - if (!IsDisabled() && !s.OnCastInTown(this)) + m_GuardParams[0] = focus; + + try { - m.SendLocalizedMessage(500946); // You cannot cast this in town! - return false; + GuardType.CreateInstance(m_GuardParams); } - - return base.OnBeginSpellCast(m, s); - } - - public override bool AllowHousing(Mobile from, Point3D p) => false; - - public override void MakeGuard(Mobile focus) - { - var eable = focus.GetMobilesInRange(8); - var useGuard = eable.FirstOrDefault(m => m.Focus == null); - - eable.Free(); - - if (useGuard == null) + catch { - m_GuardParams[0] = focus; - - try - { - m_GuardType.CreateInstance(m_GuardParams); - } - catch - { - // ignored - } - } - else - { - useGuard.Focus = focus; + // ignored } } - - public override void OnEnter(Mobile m) + else { - if (IsDisabled()) + useGuard.Focus = focus; + } + } + + public override void OnEnter(Mobile m) + { + if (IsDisabled()) + { + return; + } + + if (!AllowReds && m.Kills >= 5) + { + CheckGuardCandidate(m); + } + } + + public override void OnExit(Mobile m) + { + } + + public override void OnSpeech(SpeechEventArgs args) + { + base.OnSpeech(args); + + if (IsDisabled()) + { + return; + } + + if (args.Mobile.Alive && args.HasKeyword(0x0007)) // *guards* + { + CallGuards(args.Mobile.Location); + } + } + + public override void OnAggressed(Mobile aggressor, Mobile aggressed, bool criminal) + { + base.OnAggressed(aggressor, aggressed, criminal); + + if (!IsDisabled() && aggressor != aggressed && criminal) + { + CheckGuardCandidate(aggressor); + } + } + + public override void OnGotBeneficialAction(Mobile helper, Mobile helped) + { + base.OnGotBeneficialAction(helper, helped); + + if (IsDisabled()) + { + return; + } + + var noto = Notoriety.Compute(helper, helped); + + if (helper != helped && noto is Notoriety.Criminal or Notoriety.Murderer) + { + CheckGuardCandidate(helper); + } + } + + public override void OnCriminalAction(Mobile m, bool message) + { + base.OnCriminalAction(m, message); + + if (!IsDisabled()) + { + CheckGuardCandidate(m); + } + } + + public void CheckGuardCandidate(Mobile m) + { + if (IsDisabled() || !IsGuardCandidate(m)) + { + return; + } + + if (!m_GuardCandidates.TryGetValue(m, out var timer)) + { + timer = new GuardTimer(m, m_GuardCandidates); + timer.Start(); + + m_GuardCandidates[m] = timer; + m.SendLocalizedMessage(502275); // Guards can now be called on you! + + var map = m.Map; + + if (map == null) { return; } - if (!AllowReds && m.Kills >= 5) + Mobile fakeCall = null; + var prio = 0.0; + + foreach (var v in m.GetMobilesInRange(8)) { - CheckGuardCandidate(m); - } - } - - public override void OnExit(Mobile m) - { - } - - public override void OnSpeech(SpeechEventArgs args) - { - base.OnSpeech(args); - - if (IsDisabled()) - { - return; - } - - if (args.Mobile.Alive && args.HasKeyword(0x0007)) // *guards* - { - CallGuards(args.Mobile.Location); - } - } - - public override void OnAggressed(Mobile aggressor, Mobile aggressed, bool criminal) - { - base.OnAggressed(aggressor, aggressed, criminal); - - if (!IsDisabled() && aggressor != aggressed && criminal) - { - CheckGuardCandidate(aggressor); - } - } - - public override void OnGotBeneficialAction(Mobile helper, Mobile helped) - { - base.OnGotBeneficialAction(helper, helped); - - if (IsDisabled()) - { - return; - } - - var noto = Notoriety.Compute(helper, helped); - - if (helper != helped && noto is Notoriety.Criminal or Notoriety.Murderer) - { - CheckGuardCandidate(helper); - } - } - - public override void OnCriminalAction(Mobile m, bool message) - { - base.OnCriminalAction(m, message); - - if (!IsDisabled()) - { - CheckGuardCandidate(m); - } - } - - public void CheckGuardCandidate(Mobile m) - { - if (IsDisabled() || !IsGuardCandidate(m)) - { - return; - } - - if (!m_GuardCandidates.TryGetValue(m, out var timer)) - { - timer = new GuardTimer(m, m_GuardCandidates); - timer.Start(); - - m_GuardCandidates[m] = timer; - m.SendLocalizedMessage(502275); // Guards can now be called on you! - - var map = m.Map; - - if (map == null) + if (!v.Player && v != m && !IsGuardCandidate(v) && + ((v as BaseCreature)?.IsHumanInTown() ?? v.Body.IsHuman && v.Region.IsPartOf(this))) { - return; - } + var dist = m.GetDistanceToSqrt(v); - Mobile fakeCall = null; - var prio = 0.0; - - foreach (var v in m.GetMobilesInRange(8)) - { - if (!v.Player && v != m && !IsGuardCandidate(v) && - ((v as BaseCreature)?.IsHumanInTown() ?? v.Body.IsHuman && v.Region.IsPartOf(this))) + if (fakeCall == null || dist < prio) { - var dist = m.GetDistanceToSqrt(v); - - if (fakeCall == null || dist < prio) - { - fakeCall = v; - prio = dist; - } + fakeCall = v; + prio = dist; } } - - if (fakeCall != null) - { - fakeCall.Say( - Utility.RandomList( - 1007037, - 501603, - 1013037, - 1013038, - 1013039, - 1013041, - 1013042, - 1013043, - 1013052 - ) - ); - MakeGuard(m); - timer.Stop(); - m_GuardCandidates.Remove(m); - m.SendLocalizedMessage(502276); // Guards can no longer be called on you. - } } - else + + if (fakeCall != null) { + fakeCall.Say( + Utility.RandomList( + 1007037, + 501603, + 1013037, + 1013038, + 1013039, + 1013041, + 1013042, + 1013043, + 1013052 + ) + ); + MakeGuard(m); timer.Stop(); - timer.Start(); + m_GuardCandidates.Remove(m); + m.SendLocalizedMessage(502276); // Guards can no longer be called on you. + } + } + else + { + timer.Stop(); + timer.Start(); + } + } + + public void CallGuards(Point3D p) + { + if (IsDisabled()) + { + return; + } + + var eable = Map.GetMobilesInRange(p, 14); + + foreach (var m in eable) + { + if (IsGuardCandidate(m) && + (!AllowReds && m.Kills >= 5 && m.Region.IsPartOf(this) || m_GuardCandidates.ContainsKey(m))) + { + if (m_GuardCandidates.Remove(m, out var timer)) + { + timer.Stop(); + } + + MakeGuard(m); + m.SendLocalizedMessage(502276); // Guards can no longer be called on you. + break; } } - public void CallGuards(Point3D p) + eable.Free(); + } + + public bool IsGuardCandidate(Mobile m) => + m is not BaseGuard && m.Alive && m.AccessLevel <= AccessLevel.Player && !m.Blessed && + (m is not BaseCreature creature || !creature.IsInvulnerable) && !IsDisabled() && + (!AllowReds && m.Kills >= 5 || m.Criminal); + + private class GuardTimer : Timer + { + private readonly Mobile m_Mobile; + private readonly Dictionary m_Table; + + public GuardTimer(Mobile m, Dictionary table) : base(TimeSpan.FromSeconds(15.0)) { - if (IsDisabled()) - { - return; - } - var eable = Map.GetMobilesInRange(p, 14); - - foreach (var m in eable) - { - if (IsGuardCandidate(m) && - (!AllowReds && m.Kills >= 5 && m.Region.IsPartOf(this) || m_GuardCandidates.ContainsKey(m))) - { - if (m_GuardCandidates.Remove(m, out var timer)) - { - timer.Stop(); - } - - MakeGuard(m); - m.SendLocalizedMessage(502276); // Guards can no longer be called on you. - break; - } - } - - eable.Free(); + m_Mobile = m; + m_Table = table; } - public bool IsGuardCandidate(Mobile m) => - m is not BaseGuard && m.Alive && m.AccessLevel <= AccessLevel.Player && !m.Blessed && - (m is not BaseCreature creature || !creature.IsInvulnerable) && !IsDisabled() && - (!AllowReds && m.Kills >= 5 || m.Criminal); - - private class GuardTimer : Timer + protected override void OnTick() { - private readonly Mobile m_Mobile; - private readonly Dictionary m_Table; - - public GuardTimer(Mobile m, Dictionary table) : base(TimeSpan.FromSeconds(15.0)) + if (m_Table.Remove(m_Mobile)) { - - m_Mobile = m; - m_Table = table; - } - - protected override void OnTick() - { - if (m_Table.Remove(m_Mobile)) - { - m_Mobile.SendLocalizedMessage(502276); // Guards can no longer be called on you. - } + m_Mobile.SendLocalizedMessage(502276); // Guards can no longer be called on you. } } } diff --git a/Projects/UOContent/Regions/HouseRegion.cs b/Projects/UOContent/Regions/HouseRegion.cs index d787f52d2..5f6c01959 100644 --- a/Projects/UOContent/Regions/HouseRegion.cs +++ b/Projects/UOContent/Regions/HouseRegion.cs @@ -4,407 +4,406 @@ using Server.Items; using Server.Mobiles; using Server.Multis; -namespace Server.Regions +namespace Server.Regions; + +public class HouseRegion : BaseRegion { - public class HouseRegion : BaseRegion + public static readonly int HousePriority = DefaultPriority + 1; + + public static TimeSpan CombatHeatDelay = TimeSpan.FromSeconds(30.0); + + private bool m_Recursion; + + public HouseRegion(BaseHouse house) : base(null, house.Map, HousePriority, GetArea(house)) { - public static readonly int HousePriority = DefaultPriority + 1; + House = house; - public static TimeSpan CombatHeatDelay = TimeSpan.FromSeconds(30.0); + var ban = house.RelativeBanLocation; - private bool m_Recursion; + GoLocation = new Point3D(house.X + ban.X, house.Y + ban.Y, house.Z + ban.Z); + } - public HouseRegion(BaseHouse house) : base(null, house.Map, HousePriority, GetArea(house)) + public BaseHouse House { get; } + + public static void Initialize() + { + EventSink.Login += OnLogin; + } + + public static void OnLogin(Mobile m) + { + var house = BaseHouse.FindHouseAt(m); + + if (house?.Public == false && !house.IsFriend(m)) { - House = house; + m.Location = house.BanLocation; + } + } - var ban = house.RelativeBanLocation; + public override bool AllowHousing(Mobile from, Point3D p) => false; - GoLocation = new Point3D(house.X + ban.X, house.Y + ban.Y, house.Z + ban.Z); + private static Rectangle3D[] GetArea(BaseHouse house) + { + var x = house.X; + var y = house.Y; + // int z = house.Z; + + var houseArea = house.Area; + var area = new Rectangle3D[houseArea.Length]; + + for (var i = 0; i < area.Length; i++) + { + var rect = houseArea[i]; + area[i] = ConvertTo3D(new Rectangle2D(x + rect.Start.X, y + rect.Start.Y, rect.Width, rect.Height)); } - public BaseHouse House { get; } + return area; + } - public static void Initialize() + public override bool SendInaccessibleMessage(Item item, Mobile from) + { + if (item is Container) { - EventSink.Login += OnLogin; + item.SendLocalizedMessageTo(from, 501647); // That is secure. + } + else + { + item.SendLocalizedMessageTo(from, 1061637); // You are not allowed to access this. } - public static void OnLogin(Mobile m) - { - var house = BaseHouse.FindHouseAt(m); + return true; + } - if (house?.Public == false && !house.IsFriend(m)) - { - m.Location = house.BanLocation; - } + public override bool CheckAccessibility(Item item, Mobile from) => House.CheckAccessibility(item, from); + + // Use OnLocationChanged instead of OnEnter because it can be that we enter a house region even though we're not actually inside the house + public override void OnLocationChanged(Mobile m, Point3D oldLocation) + { + if (m_Recursion) + { + return; } - public override bool AllowHousing(Mobile from, Point3D p) => false; + base.OnLocationChanged(m, oldLocation); - private static Rectangle3D[] GetArea(BaseHouse house) + m_Recursion = true; + + var bc = m as BaseCreature; + + if (bc?.NoHouseRestrictions != true && + (bc?.IsHouseSummonable != true || BaseCreature.Summoning || House.IsInside(oldLocation, 16))) { - var x = house.X; - var y = house.Y; - // int z = house.Z; - - var houseArea = house.Area; - var area = new Rectangle3D[houseArea.Length]; - - for (var i = 0; i < area.Length; i++) + if ((House.Public || !House.IsAosRules) && House.IsBanned(m) && House.IsInside(m)) { - var rect = houseArea[i]; - area[i] = ConvertTo3D(new Rectangle2D(x + rect.Start.X, y + rect.Start.Y, rect.Width, rect.Height)); - } + m.Location = House.BanLocation; - return area; - } - - public override bool SendInaccessibleMessage(Item item, Mobile from) - { - if (item is Container) - { - item.SendLocalizedMessageTo(from, 501647); // That is secure. - } - else - { - item.SendLocalizedMessageTo(from, 1061637); // You are not allowed to access this. - } - - return true; - } - - public override bool CheckAccessibility(Item item, Mobile from) => House.CheckAccessibility(item, from); - - // Use OnLocationChanged instead of OnEnter because it can be that we enter a house region even though we're not actually inside the house - public override void OnLocationChanged(Mobile m, Point3D oldLocation) - { - if (m_Recursion) - { - return; - } - - base.OnLocationChanged(m, oldLocation); - - m_Recursion = true; - - var bc = m as BaseCreature; - - if (bc?.NoHouseRestrictions != true && - (bc?.IsHouseSummonable != true || BaseCreature.Summoning || House.IsInside(oldLocation, 16))) - { - if ((House.Public || !House.IsAosRules) && House.IsBanned(m) && House.IsInside(m)) + if (!Core.SE) { - m.Location = House.BanLocation; - - if (!Core.SE) - { - m.SendLocalizedMessage(501284); // You may not enter. - } - } - else if (House.IsAosRules && !House.Public && !House.HasAccess(m) && House.IsInside(m)) - { - m.Location = House.BanLocation; - - if (!Core.SE) - { - m.SendLocalizedMessage(501284); // You may not enter. - } - } - else if (House.IsCombatRestricted(m) && House.IsInside(m) && !House.IsInside(oldLocation, 16)) - { - m.Location = House.BanLocation; - m.SendLocalizedMessage(1061637); // You are not allowed to access this. - } - else if (House is HouseFoundation foundation && foundation.Customizer != null && - foundation.Customizer != m && - House.IsInside(m)) - { - m.Location = House.BanLocation; + m.SendLocalizedMessage(501284); // You may not enter. } } - - if (House.InternalizedVendors.Count > 0 && House.IsInside(m) && !House.IsInside(oldLocation, 16) && - House.IsOwner(m) && m.Alive && !m.HasGump()) + else if (House.IsAosRules && !House.Public && !House.HasAccess(m) && House.IsInside(m)) { - m.SendGump(new NoticeGump(1060635, 30720, 1061826, 32512, 320, 180)); - } + m.Location = House.BanLocation; - m_Recursion = false; + if (!Core.SE) + { + m.SendLocalizedMessage(501284); // You may not enter. + } + } + else if (House.IsCombatRestricted(m) && House.IsInside(m) && !House.IsInside(oldLocation, 16)) + { + m.Location = House.BanLocation; + m.SendLocalizedMessage(1061637); // You are not allowed to access this. + } + else if (House is HouseFoundation foundation && foundation.Customizer != null && + foundation.Customizer != m && + House.IsInside(m)) + { + m.Location = House.BanLocation; + } } - public override bool OnMoveInto(Mobile from, Direction d, Point3D newLocation, Point3D oldLocation) + if (House.InternalizedVendors.Count > 0 && House.IsInside(m) && !House.IsInside(oldLocation, 16) && + House.IsOwner(m) && m.Alive && !m.HasGump()) { - if (!base.OnMoveInto(from, d, newLocation, oldLocation)) + m.SendGump(new NoticeGump(1060635, 30720, 1061826, 32512, 320, 180)); + } + + m_Recursion = false; + } + + public override bool OnMoveInto(Mobile from, Direction d, Point3D newLocation, Point3D oldLocation) + { + if (!base.OnMoveInto(from, d, newLocation, oldLocation)) + { + return false; + } + + var bc = from as BaseCreature; + + if (bc?.NoHouseRestrictions != true) + { + if (bc?.Controlled == false) // Untamed creatures cannot enter public houses { return false; } - var bc = from as BaseCreature; - - if (bc?.NoHouseRestrictions != true) + if (bc?.IsHouseSummonable == true && + !(BaseCreature.Summoning || House.IsInside(oldLocation, 16))) { - if (bc?.Controlled == false) // Untamed creatures cannot enter public houses - { - return false; - } - - if (bc?.IsHouseSummonable == true && - !(BaseCreature.Summoning || House.IsInside(oldLocation, 16))) - { - return false; - } - - if (bc?.Controlled == false && House.IsAosRules && !House.Public) - { - return false; - } - - if ((House.Public || !House.IsAosRules) && House.IsBanned(from) && House.IsInside(newLocation, 16)) - { - from.Location = House.BanLocation; - - if (!Core.SE) - { - from.SendLocalizedMessage(501284); // You may not enter. - } - - return false; - } - - if (House.IsAosRules && !House.Public && !House.HasAccess(from) && House.IsInside(newLocation, 16)) - { - if (!Core.SE) - { - from.SendLocalizedMessage(501284); // You may not enter. - } - - return false; - } - - if (House.IsCombatRestricted(from) && !House.IsInside(oldLocation, 16) && House.IsInside(newLocation, 16)) - { - from.SendLocalizedMessage(1061637); // You are not allowed to access this. - return false; - } - - if (House is HouseFoundation foundation && foundation.Customizer != null && foundation.Customizer != from && - House.IsInside(newLocation, 16)) - { - return false; - } + return false; } - if (House.InternalizedVendors.Count > 0 && House.IsInside(from) && !House.IsInside(oldLocation, 16) && - House.IsOwner(from) && from.Alive && - !from.HasGump()) + if (bc?.Controlled == false && House.IsAosRules && !House.Public) { - from.SendGump(new NoticeGump(1060635, 30720, 1061826, 32512, 320, 180)); + return false; } - return true; + if ((House.Public || !House.IsAosRules) && House.IsBanned(from) && House.IsInside(newLocation, 16)) + { + from.Location = House.BanLocation; + + if (!Core.SE) + { + from.SendLocalizedMessage(501284); // You may not enter. + } + + return false; + } + + if (House.IsAosRules && !House.Public && !House.HasAccess(from) && House.IsInside(newLocation, 16)) + { + if (!Core.SE) + { + from.SendLocalizedMessage(501284); // You may not enter. + } + + return false; + } + + if (House.IsCombatRestricted(from) && !House.IsInside(oldLocation, 16) && House.IsInside(newLocation, 16)) + { + from.SendLocalizedMessage(1061637); // You are not allowed to access this. + return false; + } + + if (House is HouseFoundation foundation && foundation.Customizer != null && foundation.Customizer != from && + House.IsInside(newLocation, 16)) + { + return false; + } } - public override bool OnDecay(Item item) => - (!House.HasLockedDownItem(item) && !House.HasSecureItem(item) || !House.IsInside(item)) && base.OnDecay(item); - - public override TimeSpan GetLogoutDelay(Mobile m) + if (House.InternalizedVendors.Count > 0 && House.IsInside(from) && !House.IsInside(oldLocation, 16) && + House.IsOwner(from) && from.Alive && + !from.HasGump()) { - if (!House.IsFriend(m) || !House.IsInside(m)) + from.SendGump(new NoticeGump(1060635, 30720, 1061826, 32512, 320, 180)); + } + + return true; + } + + public override bool OnDecay(Item item) => + (!House.HasLockedDownItem(item) && !House.HasSecureItem(item) || !House.IsInside(item)) && base.OnDecay(item); + + public override TimeSpan GetLogoutDelay(Mobile m) + { + if (!House.IsFriend(m) || !House.IsInside(m)) + { + return base.GetLogoutDelay(m); + } + + foreach (var info in m.Aggressed) + { + if (info.Defender.Player && Core.Now - info.LastCombatTime < CombatHeatDelay) { return base.GetLogoutDelay(m); } - - foreach (var info in m.Aggressed) - { - if (info.Defender.Player && Core.Now - info.LastCombatTime < CombatHeatDelay) - { - return base.GetLogoutDelay(m); - } - } - - return TimeSpan.Zero; } - public override void OnSpeech(SpeechEventArgs e) + return TimeSpan.Zero; + } + + public override void OnSpeech(SpeechEventArgs e) + { + base.OnSpeech(e); + + var from = e.Mobile; + Item sign = House.Sign; + + var isOwner = House.IsOwner(from); + var isCoOwner = isOwner || House.IsCoOwner(from); + var isFriend = isCoOwner || House.IsFriend(from); + + if (!isFriend) { - base.OnSpeech(e); + return; + } - var from = e.Mobile; - Item sign = House.Sign; + if (!from.Alive) + { + return; + } - var isOwner = House.IsOwner(from); - var isCoOwner = isOwner || House.IsCoOwner(from); - var isFriend = isCoOwner || House.IsFriend(from); - - if (!isFriend) + if (Core.ML && e.Speech.InsensitiveEquals("I wish to resize my house")) + { + if (from.Map != sign.Map || !from.InRange(sign, 0)) { - return; + from.SendLocalizedMessage(500295); // you are too far away to do that. } - - if (!from.Alive) + else if (Core.Now <= House.BuiltOn.AddHours(1)) { - return; + from.SendLocalizedMessage(1080178); // You must wait one hour between each house demolition. } - - if (Core.ML && e.Speech.InsensitiveEquals("I wish to resize my house")) + else if (isOwner) { - if (from.Map != sign.Map || !from.InRange(sign, 0)) - { - from.SendLocalizedMessage(500295); // you are too far away to do that. - } - else if (Core.Now <= House.BuiltOn.AddHours(1)) - { - from.SendLocalizedMessage(1080178); // You must wait one hour between each house demolition. - } - else if (isOwner) - { - from.CloseGump(); - from.CloseGump(); - from.SendGump(new ConfirmHouseResize(from, House)); - } - else - { - from.SendLocalizedMessage(501320); // Only the house owner may do this. - } + from.CloseGump(); + from.CloseGump(); + from.SendGump(new ConfirmHouseResize(from, House)); } - - if (!House.IsInside(from) || !House.IsActive) + else { - return; - } - - if (e.HasKeyword(0x33)) // remove thyself - { - from.SendLocalizedMessage(501326); // Target the individual to eject from this house. - from.Target = new HouseKickTarget(House); - } - else if (e.HasKeyword(0x34)) // I ban thee - { - if (!House.Public && House.IsAosRules) - { - from.SendLocalizedMessage( - 1062521 - ); // You cannot ban someone from a private house. Revoke their access instead. - } - else - { - from.SendLocalizedMessage(501325); // Target the individual to ban from this house. - from.Target = new HouseBanTarget(true, House); - } - } - else if (e.HasKeyword(0x23)) // I wish to lock this down - { - if (isCoOwner) - { - from.SendLocalizedMessage(502097); // Lock what down? - from.Target = new LockdownTarget(false, House); - } - else - { - from.SendLocalizedMessage(1010587); // You are not a co-owner of this house. - } - } - else if (e.HasKeyword(0x24)) // I wish to release this - { - if (isCoOwner) - { - from.SendLocalizedMessage(502100); // Choose the item you wish to release - from.Target = new LockdownTarget(true, House); - } - else - { - from.SendLocalizedMessage(1010587); // You are not a co-owner of this house. - } - } - else if (e.HasKeyword(0x25)) // I wish to secure this - { - if (isOwner) - { - from.SendLocalizedMessage(502103); // Choose the item you wish to secure - from.Target = new SecureTarget(false, House); - } - else - { - from.SendLocalizedMessage(502094); // You must be in your house to do this. - } - } - else if (e.HasKeyword(0x26)) // I wish to unsecure this - { - if (isOwner) - { - from.SendLocalizedMessage(502106); // Choose the item you wish to unsecure - from.Target = new SecureTarget(true, House); - } - else - { - from.SendLocalizedMessage(502094); // You must be in your house to do this. - } - } - else if (e.HasKeyword(0x27)) // I wish to place a strongbox - { - if (isOwner) - { - from.SendLocalizedMessage(502109); // Owners do not get a strongbox of their own. - } - else if (isCoOwner) - { - House.AddStrongBox(from); - } - else - { - from.SendLocalizedMessage(1010587); // You are not a co-owner of this house. - } - } - else if (e.HasKeyword(0x28)) // trash barrel - { - if (isCoOwner) - { - House.AddTrashBarrel(from); - } - else - { - from.SendLocalizedMessage(1010587); // You are not a co-owner of this house. - } + from.SendLocalizedMessage(501320); // Only the house owner may do this. } } - public override bool OnDoubleClick(Mobile from, object o) + if (!House.IsInside(from) || !House.IsActive) { - if (o is Container c) - { - var res = House.CheckSecureAccess(from, c); - - if (res == SecureAccessResult.Accessible) - { - return true; - } - - if (res == SecureAccessResult.Inaccessible) - { - c.SendLocalizedMessageTo(from, 1010563); - return false; - } - } - - return base.OnDoubleClick(from, o); + return; } - public override bool OnSingleClick(Mobile from, object o) + if (e.HasKeyword(0x33)) // remove thyself { - if (o is Item item) + from.SendLocalizedMessage(501326); // Target the individual to eject from this house. + from.Target = new HouseKickTarget(House); + } + else if (e.HasKeyword(0x34)) // I ban thee + { + if (!House.Public && House.IsAosRules) { - if (House.HasLockedDownItem(item)) - { - item.LabelTo(from, 501643); // [locked down] - } - else if (House.HasSecureItem(item)) - { - item.LabelTo(from, 501644); // [locked down & secure] - } + from.SendLocalizedMessage( + 1062521 + ); // You cannot ban someone from a private house. Revoke their access instead. + } + else + { + from.SendLocalizedMessage(501325); // Target the individual to ban from this house. + from.Target = new HouseBanTarget(true, House); + } + } + else if (e.HasKeyword(0x23)) // I wish to lock this down + { + if (isCoOwner) + { + from.SendLocalizedMessage(502097); // Lock what down? + from.Target = new LockdownTarget(false, House); + } + else + { + from.SendLocalizedMessage(1010587); // You are not a co-owner of this house. + } + } + else if (e.HasKeyword(0x24)) // I wish to release this + { + if (isCoOwner) + { + from.SendLocalizedMessage(502100); // Choose the item you wish to release + from.Target = new LockdownTarget(true, House); + } + else + { + from.SendLocalizedMessage(1010587); // You are not a co-owner of this house. + } + } + else if (e.HasKeyword(0x25)) // I wish to secure this + { + if (isOwner) + { + from.SendLocalizedMessage(502103); // Choose the item you wish to secure + from.Target = new SecureTarget(false, House); + } + else + { + from.SendLocalizedMessage(502094); // You must be in your house to do this. + } + } + else if (e.HasKeyword(0x26)) // I wish to unsecure this + { + if (isOwner) + { + from.SendLocalizedMessage(502106); // Choose the item you wish to unsecure + from.Target = new SecureTarget(true, House); + } + else + { + from.SendLocalizedMessage(502094); // You must be in your house to do this. + } + } + else if (e.HasKeyword(0x27)) // I wish to place a strongbox + { + if (isOwner) + { + from.SendLocalizedMessage(502109); // Owners do not get a strongbox of their own. + } + else if (isCoOwner) + { + House.AddStrongBox(from); + } + else + { + from.SendLocalizedMessage(1010587); // You are not a co-owner of this house. + } + } + else if (e.HasKeyword(0x28)) // trash barrel + { + if (isCoOwner) + { + House.AddTrashBarrel(from); + } + else + { + from.SendLocalizedMessage(1010587); // You are not a co-owner of this house. } - - return base.OnSingleClick(from, o); } } -} + + public override bool OnDoubleClick(Mobile from, object o) + { + if (o is Container c) + { + var res = House.CheckSecureAccess(from, c); + + if (res == SecureAccessResult.Accessible) + { + return true; + } + + if (res == SecureAccessResult.Inaccessible) + { + c.SendLocalizedMessageTo(from, 1010563); + return false; + } + } + + return base.OnDoubleClick(from, o); + } + + public override bool OnSingleClick(Mobile from, object o) + { + if (o is Item item) + { + if (House.HasLockedDownItem(item)) + { + item.LabelTo(from, 501643); // [locked down] + } + else if (House.HasSecureItem(item)) + { + item.LabelTo(from, 501644); // [locked down & secure] + } + } + + return base.OnSingleClick(from, o); + } +} \ No newline at end of file diff --git a/Projects/UOContent/Regions/JailRegion.cs b/Projects/UOContent/Regions/JailRegion.cs index 5b78604fa..d02e490b5 100644 --- a/Projects/UOContent/Regions/JailRegion.cs +++ b/Projects/UOContent/Regions/JailRegion.cs @@ -1,77 +1,80 @@ -using System.Text.Json; -using Server.Json; using Server.Spells; -namespace Server.Regions +namespace Server.Regions; + +public class JailRegion : BaseRegion { - public class JailRegion : BaseRegion + public JailRegion(string name, Map map, Region parent, params Rectangle3D[] area) + : base(name, map, parent, area) { - public JailRegion(DynamicJson json, JsonSerializerOptions options) : base(json, options) - { - } - - public override bool AllowBeneficial(Mobile from, Mobile target) - { - if (from.AccessLevel == AccessLevel.Player) - { - from.SendMessage("You may not do that in jail."); - return false; - } - - return true; - } - - public override bool AllowHarmful(Mobile from, Mobile target) - { - if (from.AccessLevel == AccessLevel.Player) - { - from.SendMessage("You may not do that in jail."); - return false; - } - - return true; - } - - public override bool AllowHousing(Mobile from, Point3D p) => false; - - public override void AlterLightLevel(Mobile m, ref int global, ref int personal) - { - global = LightCycle.JailLevel; - } - - public override bool CheckTravel(Mobile m, Point3D newLocation, TravelCheckType travelType) - { - if (m?.AccessLevel == AccessLevel.Player) - { - m.SendLocalizedMessage(1114345); // You'll need a better jailbreak plan than that! - return false; - } - - return base.CheckTravel(m, newLocation, travelType); - } - - public override bool OnBeginSpellCast(Mobile from, ISpell s) - { - if (from.AccessLevel == AccessLevel.Player) - { - from.SendLocalizedMessage(502629); // You cannot cast spells here. - return false; - } - - return true; - } - - public override bool OnSkillUse(Mobile from, int Skill) - { - if (from.AccessLevel == AccessLevel.Player) - { - from.SendMessage("You may not use skills in jail."); - return false; - } - - return true; - } - - public override bool OnCombatantChange(Mobile from, Mobile Old, Mobile New) => from.AccessLevel > AccessLevel.Player; } + + public JailRegion(string name, Map map, Region parent, int priority, params Rectangle3D[] area) + : base(name, map, parent, priority, area) + { + } + + public override bool AllowBeneficial(Mobile from, Mobile target) + { + if (from.AccessLevel == AccessLevel.Player) + { + from.SendMessage("You may not do that in jail."); + return false; + } + + return true; + } + + public override bool AllowHarmful(Mobile from, Mobile target) + { + if (from.AccessLevel == AccessLevel.Player) + { + from.SendMessage("You may not do that in jail."); + return false; + } + + return true; + } + + public override bool AllowHousing(Mobile from, Point3D p) => false; + + public override void AlterLightLevel(Mobile m, ref int global, ref int personal) + { + global = LightCycle.JailLevel; + } + + public override bool CheckTravel(Mobile m, Point3D newLocation, TravelCheckType travelType) + { + if (m?.AccessLevel == AccessLevel.Player) + { + m.SendLocalizedMessage(1114345); // You'll need a better jailbreak plan than that! + return false; + } + + return base.CheckTravel(m, newLocation, travelType); + } + + public override bool OnBeginSpellCast(Mobile from, ISpell s) + { + if (from.AccessLevel == AccessLevel.Player) + { + from.SendLocalizedMessage(502629); // You cannot cast spells here. + return false; + } + + return true; + } + + public override bool OnSkillUse(Mobile from, int Skill) + { + if (from.AccessLevel == AccessLevel.Player) + { + from.SendMessage("You may not use skills in jail."); + return false; + } + + return true; + } + + public override bool OnCombatantChange(Mobile from, Mobile Old, Mobile New) => from.AccessLevel > AccessLevel.Player; } diff --git a/Projects/UOContent/Regions/JsonDtos/BaseRegionJsonDto.cs b/Projects/UOContent/Regions/JsonDtos/BaseRegionJsonDto.cs new file mode 100644 index 000000000..3c9becffb --- /dev/null +++ b/Projects/UOContent/Regions/JsonDtos/BaseRegionJsonDto.cs @@ -0,0 +1,29 @@ +namespace Server.Regions; + +public class BaseRegionJsonDto : GenericRegionJsonDto where TRegion : BaseRegion +{ + public string RuneName { get; set; } + public bool NoLogoutDelay { get; set; } + + public override void FromRegion(Region region) + { + base.FromRegion(region); + + if (region is BaseRegion baseRegion) + { + RuneName = baseRegion.RuneName; + NoLogoutDelay = baseRegion.NoLogoutDelay; + } + } + + protected override void HydrateRegion(Region region) + { + base.HydrateRegion(region); + + if (region is BaseRegion baseRegion) + { + baseRegion.RuneName = RuneName; + baseRegion.NoLogoutDelay = NoLogoutDelay; + } + } +} diff --git a/Projects/UOContent/Regions/JsonDtos/DungeonRegionJsonDto.cs b/Projects/UOContent/Regions/JsonDtos/DungeonRegionJsonDto.cs new file mode 100644 index 000000000..7e85b9915 --- /dev/null +++ b/Projects/UOContent/Regions/JsonDtos/DungeonRegionJsonDto.cs @@ -0,0 +1,26 @@ +namespace Server.Regions; + +public class DungeonRegionJsonDto : BaseRegionJsonDto where TRegion : DungeonRegion +{ + public Point3D Entrance { get; set; } + + public override void FromRegion(Region region) + { + base.FromRegion(region); + + if (region is DungeonRegion dungeonRegion) + { + Entrance = dungeonRegion.Entrance; + } + } + + protected override void HydrateRegion(Region region) + { + base.HydrateRegion(region); + + if (region is DungeonRegion dungeonRegion) + { + dungeonRegion.Entrance = Entrance; + } + } +} diff --git a/Projects/UOContent/Regions/JsonDtos/GenericRegionJsonDto.cs b/Projects/UOContent/Regions/JsonDtos/GenericRegionJsonDto.cs new file mode 100644 index 000000000..f80617c08 --- /dev/null +++ b/Projects/UOContent/Regions/JsonDtos/GenericRegionJsonDto.cs @@ -0,0 +1,34 @@ +using System; +using System.Text.Json.Serialization; + +namespace Server.Regions; + +public class GenericRegionJsonDto : RegionJsonDto where TRegion : BaseRegion +{ + [JsonIgnore] + public override Type RegionType => typeof(TRegion); + public string RuneName { get; set; } + public bool NoLogoutDelay { get; set; } + + public override void FromRegion(Region region) + { + base.FromRegion(region); + + if (region is BaseRegion baseRegion) + { + RuneName = baseRegion.RuneName; + NoLogoutDelay = baseRegion.NoLogoutDelay; + } + } + + protected override void HydrateRegion(Region region) + { + base.HydrateRegion(region); + + if (region is BaseRegion baseRegion) + { + baseRegion.RuneName = RuneName; + baseRegion.NoLogoutDelay = NoLogoutDelay; + } + } +} diff --git a/Projects/UOContent/Regions/JsonDtos/GuardedRegionJsonDto.cs b/Projects/UOContent/Regions/JsonDtos/GuardedRegionJsonDto.cs new file mode 100644 index 000000000..bd19f9956 --- /dev/null +++ b/Projects/UOContent/Regions/JsonDtos/GuardedRegionJsonDto.cs @@ -0,0 +1,30 @@ +using System; + +namespace Server.Regions; + +public class GuardedRegionJsonDto : BaseRegionJsonDto where TRegion : GuardedRegion +{ + public bool GuardsDisabled { get; set; } + public Type? GuardType { get; set; } + + public override void FromRegion(Region region) + { + base.FromRegion(region); + + if (region is GuardedRegion guardedRegion) + { + GuardsDisabled = guardedRegion.GuardsDisabled; + GuardType = guardedRegion.GuardType == guardedRegion.DefaultGuardType ? null : guardedRegion.GuardType; + } + } + + protected override void HydrateRegion(Region region) + { + base.HydrateRegion(region); + if (region is GuardedRegion guardedRegion) + { + guardedRegion.GuardsDisabled = GuardsDisabled; + guardedRegion.GuardType = GuardType ?? guardedRegion.DefaultGuardType; + } + } +} diff --git a/Projects/UOContent/Regions/JsonDtos/RegionJsonDtoExt.cs b/Projects/UOContent/Regions/JsonDtos/RegionJsonDtoExt.cs new file mode 100644 index 000000000..42a244ee9 --- /dev/null +++ b/Projects/UOContent/Regions/JsonDtos/RegionJsonDtoExt.cs @@ -0,0 +1,21 @@ +namespace Server.Regions; + +public static class RegionJsonDtoExt +{ + public static void Configure() + { + RegionJsonSerializer.RegisterRegionForSerialization, BaseRegion>(); + + RegionJsonSerializer.RegisterRegionForSerialization, DungeonRegion>(); + RegionJsonSerializer.RegisterRegionForSerialization, GuardedRegion>(); + + RegionJsonSerializer.RegisterRegionForSerialization, GreenAcresRegion>(); + RegionJsonSerializer.RegisterRegionForSerialization, JailRegion>(); + RegionJsonSerializer.RegisterRegionForSerialization, MondainRegion>(); + RegionJsonSerializer.RegisterRegionForSerialization, NewMaginciaRegion>(); + RegionJsonSerializer.RegisterRegionForSerialization, NoHousingRegion>(); + RegionJsonSerializer.RegisterRegionForSerialization, NoTravelSpellsAllowedRegion>(); + RegionJsonSerializer.RegisterRegionForSerialization, TownRegion>(); + RegionJsonSerializer.RegisterRegionForSerialization, TwistedWealdDesertRegion>(); + } +} diff --git a/Projects/UOContent/Regions/MondainRegion.cs b/Projects/UOContent/Regions/MondainRegion.cs index c998085d5..46103a2ec 100644 --- a/Projects/UOContent/Regions/MondainRegion.cs +++ b/Projects/UOContent/Regions/MondainRegion.cs @@ -1,24 +1,27 @@ -using System.Text.Json; -using Server.Json; using Server.Spells.Sixth; -namespace Server.Regions +namespace Server.Regions; + +public class MondainRegion : NoTravelSpellsAllowedRegion { - public class MondainRegion : NoTravelSpellsAllowedRegion + public MondainRegion(string name, Map map, Region parent, params Rectangle3D[] area) + : base(name, map, parent, area) { - public MondainRegion(DynamicJson json, JsonSerializerOptions options) : base(json, options) + } + + public MondainRegion(string name, Map map, Region parent, int priority, params Rectangle3D[] area) + : base(name, map, parent, priority, area) + { + } + + public override bool OnBeginSpellCast(Mobile m, ISpell s) + { + if (m.Player && s is MarkSpell) { + m.SendLocalizedMessage(501802); // Thy spell doth not appear to work... + return false; } - public override bool OnBeginSpellCast(Mobile m, ISpell s) - { - if (m.Player && s is MarkSpell) - { - m.SendLocalizedMessage(501802); // Thy spell doth not appear to work... - return false; - } - - return base.OnBeginSpellCast(m, s); - } + return base.OnBeginSpellCast(m, s); } } diff --git a/Projects/UOContent/Regions/NewMaginciaRegion.cs b/Projects/UOContent/Regions/NewMaginciaRegion.cs index 8e3bf2706..ba2e3d53e 100644 --- a/Projects/UOContent/Regions/NewMaginciaRegion.cs +++ b/Projects/UOContent/Regions/NewMaginciaRegion.cs @@ -1,13 +1,14 @@ -using System.Text.Json; -using Server.Json; -using Server.Regions; +namespace Server.Regions; -namespace Server.Engines.NewMagincia +public class NewMaginciaRegion : TownRegion { - public class NewMaginciaRegion : TownRegion + public NewMaginciaRegion(string name, Map map, Region parent, params Rectangle3D[] area) + : base(name, map, parent, area) + { + } + + public NewMaginciaRegion(string name, Map map, Region parent, int priority, params Rectangle3D[] area) + : base(name, map, parent, priority, area) { - public NewMaginciaRegion(DynamicJson json, JsonSerializerOptions options) : base(json, options) - { - } } } diff --git a/Projects/UOContent/Regions/NoHousingRegion.cs b/Projects/UOContent/Regions/NoHousingRegion.cs index 537d11960..4709aee35 100644 --- a/Projects/UOContent/Regions/NoHousingRegion.cs +++ b/Projects/UOContent/Regions/NoHousingRegion.cs @@ -1,18 +1,16 @@ -using System.Text.Json; -using Server.Json; +namespace Server.Regions; -namespace Server.Regions +public class NoHousingRegion : BaseRegion { - public class NoHousingRegion : BaseRegion + public NoHousingRegion(string name, Map map, Region parent, params Rectangle3D[] area) + : base(name, map, parent, area) { - public NoHousingRegion(DynamicJson json, JsonSerializerOptions options) : base(json, options) => - SmartChecking = json.GetProperty("smartNoHousing", options, out bool smartNoHousing) && smartNoHousing; - - /* False: this uses 'stupid OSI' house placement checking: part of the house may be placed here provided that the center is not in the region - * True: this uses 'smart RunUO' house placement checking: no part of the house may be in the region - */ - public bool SmartChecking { get; } - - public override bool AllowHousing(Mobile from, Point3D p) => SmartChecking; } + + public NoHousingRegion(string name, Map map, Region parent, int priority, params Rectangle3D[] area) + : base(name, map, parent, priority, area) + { + } + + public override bool AllowHousing(Mobile from, Point3D p) => true; } diff --git a/Projects/UOContent/Regions/NoTravelSpellsAllowedRegion.cs b/Projects/UOContent/Regions/NoTravelSpellsAllowedRegion.cs index 46429f4c9..8d5b437e3 100644 --- a/Projects/UOContent/Regions/NoTravelSpellsAllowedRegion.cs +++ b/Projects/UOContent/Regions/NoTravelSpellsAllowedRegion.cs @@ -1,12 +1,16 @@ -using System.Text.Json; using Server; -using Server.Json; using Server.Regions; using Server.Spells; public class NoTravelSpellsAllowedRegion : DungeonRegion { - public NoTravelSpellsAllowedRegion(DynamicJson json, JsonSerializerOptions options) : base(json, options) + public NoTravelSpellsAllowedRegion(string name, Map map, Region parent, params Rectangle3D[] area) + : base(name, map, parent, area) + { + } + + public NoTravelSpellsAllowedRegion(string name, Map map, Region parent, int priority, params Rectangle3D[] area) + : base(name, map, parent, priority, area) { } diff --git a/Projects/UOContent/Regions/TownRegion.cs b/Projects/UOContent/Regions/TownRegion.cs index 9ae78f6de..08c8ba091 100644 --- a/Projects/UOContent/Regions/TownRegion.cs +++ b/Projects/UOContent/Regions/TownRegion.cs @@ -1,12 +1,14 @@ -using System.Text.Json; -using Server.Json; +namespace Server.Regions; -namespace Server.Regions +public class TownRegion : GuardedRegion { - public class TownRegion : GuardedRegion + public TownRegion(string name, Map map, Region parent, params Rectangle3D[] area) + : base(name, map, parent, area) + { + } + + public TownRegion(string name, Map map, Region parent, int priority, params Rectangle3D[] area) + : base(name, map, parent, priority, area) { - public TownRegion(DynamicJson json, JsonSerializerOptions options) : base(json, options) - { - } } } diff --git a/Projects/UOContent/Regions/TwistedWealdDesertRegion.cs b/Projects/UOContent/Regions/TwistedWealdDesertRegion.cs index 5eef97f8a..4eb237c9a 100644 --- a/Projects/UOContent/Regions/TwistedWealdDesertRegion.cs +++ b/Projects/UOContent/Regions/TwistedWealdDesertRegion.cs @@ -1,47 +1,50 @@ -using System.Text.Json; -using Server.Json; using Server.Network; using Server.Spells; using Server.Spells.Ninjitsu; -namespace Server.Regions +namespace Server.Regions; + +public class TwistedWealdDesertRegion : MondainRegion { - public class TwistedWealdDesertRegion : MondainRegion + public TwistedWealdDesertRegion(string name, Map map, Region parent, params Rectangle3D[] area) + : base(name, map, parent, area) { - public TwistedWealdDesertRegion(DynamicJson json, JsonSerializerOptions options) : base(json, options) - { - } + } - public static void Initialize() - { - EventSink.Login += Desert_OnLogin; - } + public TwistedWealdDesertRegion(string name, Map map, Region parent, int priority, params Rectangle3D[] area) + : base(name, map, parent, priority, area) + { + } - public override void OnEnter(Mobile m) - { - var ns = m.NetState; - if (ns != null && !TransformationSpellHelper.UnderTransformation(m, typeof(AnimalForm)) && - m.AccessLevel == AccessLevel.Player) - { - ns.SendSpeedControl(SpeedControlSetting.Walk); - } - } + public static void Initialize() + { + EventSink.Login += Desert_OnLogin; + } - public override void OnExit(Mobile m) + public override void OnEnter(Mobile m) + { + var ns = m.NetState; + if (ns != null && !TransformationSpellHelper.UnderTransformation(m, typeof(AnimalForm)) && + m.AccessLevel == AccessLevel.Player) { - var ns = m.NetState; - if (ns != null && !TransformationSpellHelper.UnderTransformation(m, typeof(AnimalForm))) - { - ns.SendSpeedControl(SpeedControlSetting.Disable); - } + ns.SendSpeedControl(SpeedControlSetting.Walk); } + } - private static void Desert_OnLogin(Mobile m) + public override void OnExit(Mobile m) + { + var ns = m.NetState; + if (ns != null && !TransformationSpellHelper.UnderTransformation(m, typeof(AnimalForm))) { - if (m.Region.IsPartOf() && m.AccessLevel == AccessLevel.Player) - { - m.NetState.SendSpeedControl(SpeedControlSetting.Walk); - } + ns.SendSpeedControl(SpeedControlSetting.Disable); + } + } + + private static void Desert_OnLogin(Mobile m) + { + if (m.Region.IsPartOf() && m.AccessLevel == AccessLevel.Player) + { + m.NetState.SendSpeedControl(SpeedControlSetting.Walk); } } }