refactor(spawners): replace DynamicJson with typed SpawnerDto records (#2505)
## Summary Removes the dated `DynamicJson` JSON helper and migrates spawner JSON (de)serialization to a polymorphic `record SpawnerDto` hierarchy. `DynamicJson` was the last remaining consumer (regions moved off it in #1400). The key correctness improvement: **System.Text.Json deserializes plain DTO records, never a live `Item`.** Previously, deserializing directly into an `Item` meant STJ constructed world-registered objects *before* the data was validated — a malformed/hand-edited spawn file could leave orphaned spawner Items in the world save. Now a parse failure is GC-only; `dto.ToSpawner()` constructs the spawner only from a fully-validated DTO and self-cleans on failure. ## What changed - **New:** `SpawnerDto` (abstract) + `SpawnerDataDto` / `RegionSpawnerDto` / `ProximitySpawnerDto`, each marked with a reusable `[JsonDiscoverableType]` opt-in attribute. Auto-discovered at the `Configure` phase — no manual registration list (avoids the regions `Register<T>()` footgun), open to custom spawner subtypes. - **Symmetric mapping:** `BaseSpawner.ToDto()` (export) ⇄ `SpawnerDto.ToSpawner()` (import). `ToSpawner()` deletes-and-rethrows on any failure, so the importer can never orphan an Item. - **`SpawnerJsonSerializer`** wires `$type` polymorphism on the `SpawnerDto` root with loud collision/constructibility validation. - **Import/export commands** rewired to the typed DTO path (reflection `FindTypeByName`/`CreateInstance` removed). - **Data migration:** the 109 `Distribution/Data/Spawns/**` files moved from `"type"`→`"$type"` and legacy `homeRange`→`spawnBounds`. The runtime still *reads* legacy `homeRange` for external files. The `homeRange→spawnBounds` formula is proven equivalent to the runtime conversion (`BoundsEquivalenceTests`, hr=0/1/3/7). - **Deleted:** `Projects/Server/Json/DynamicJson.cs`. Sparse export output matches the legacy `ToJson` (nullable DTO properties + `WhenWritingNull`). Binary world-save serialization is untouched. ## Tests - DTO round-trip per spawner type; sparse-default omission; legacy `homeRange` read; export/import file round-trip. - `Import_MalformedFile_LeaksNoWorldItems` — proves a mid-array parse failure constructs zero world Items. - `AllSpawnFilesLoadTests` — every migrated spawn file deserializes and builds. - Duplicate-discriminator validation. - UOContent.Tests 485/485, Server.Tests 710/710, build clean. ## Follow-up (not in this PR) `Rectangle3DConverter.Write` (in `Projects/Server/`) omits `z1/z2` when `Start.Z == -128`, so a future server-side export of a `homeRange`-style spawner round-trips depth 256→255. Pre-existing and out of scope here (Server change); the migrated data reads correctly. Worth a separate small converter PR.
This commit is contained in:
parent
a26219c837
commit
d8a64f3316
135 changed files with 7654 additions and 6079 deletions
|
|
@ -1,6 +1,6 @@
|
|||
[
|
||||
[
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "00b4ffd2-c3fe-42e0-b913-9dc7f244bad1",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5595, 147, 10],
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "06a27dea-d6cf-4668-aaf5-11b92f37dac2",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5403, 235, 10],
|
||||
|
|
@ -32,7 +32,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "099f8534-bad4-4baa-a701-6f52e856b767",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5615, 18, 10],
|
||||
|
|
@ -48,7 +48,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "0acf386b-aab2-42da-9852-bbab5e17235c",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5649, 101, 10],
|
||||
|
|
@ -64,7 +64,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "0b0f079f-a068-4b35-9c6a-13a2a0eefa41",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5394, 230, 10],
|
||||
|
|
@ -80,7 +80,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "11f83b98-6f66-43cd-bc2d-c8435a753629",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5390, 145, 20],
|
||||
|
|
@ -96,7 +96,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "1333be8f-f542-4131-a842-f5419ea6690b",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5405, 200, 0],
|
||||
|
|
@ -112,7 +112,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "13410a04-955c-4e3b-b88a-c59e17ec343c",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5708, 43, 0],
|
||||
|
|
@ -129,7 +129,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "16036a13-721a-447b-ae6b-a5df60d9c9ad",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5717, 60, 0],
|
||||
|
|
@ -145,7 +145,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "17349861-3ab6-4103-bd27-07d40be823d0",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5817, 83, 0],
|
||||
|
|
@ -161,7 +161,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "1bb3ab96-96dd-47df-8e4b-c788960b039f",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5817, 78, 0],
|
||||
|
|
@ -177,7 +177,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "1c97ea8d-413a-4925-8507-6c004a16ccd6",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5536, 119, -5],
|
||||
|
|
@ -193,7 +193,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "2284227d-bd9b-4b23-99c7-e96eaeacb970",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5553, 146, 20],
|
||||
|
|
@ -209,7 +209,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "22b4ddba-b4dc-46ba-b8ca-ee5c6ab5538b",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5445, 12, 0],
|
||||
|
|
@ -225,7 +225,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "24bb9e8a-3124-4984-89be-39ff6cdd3e34",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5615, 173, 0],
|
||||
|
|
@ -241,7 +241,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "25a4f4e6-8d5b-4e50-87c5-65961ef02649",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5412, 200, 0],
|
||||
|
|
@ -259,7 +259,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "27ef1488-f84c-4729-a3fc-6ad074a90495",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5557, 222, 0],
|
||||
|
|
@ -277,7 +277,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "28a61b6b-d21f-4610-aaf2-98f0714ee469",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5412, 164, 0],
|
||||
|
|
@ -294,7 +294,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "29921605-0cc3-4a0f-8fcb-d5088c40eb8b",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5412, 201, 0],
|
||||
|
|
@ -311,7 +311,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "2e200a23-7f5e-4b50-b15b-72543331cbdd",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5733, 91, 0],
|
||||
|
|
@ -327,7 +327,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "2e980b6d-486f-45a7-ad54-477a816dda3a",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5527, 210, 0],
|
||||
|
|
@ -344,7 +344,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "33b7379d-d169-43b4-a75a-2c550fb45d2e",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5711, 97, 0],
|
||||
|
|
@ -362,7 +362,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "340a9686-1ac8-47ea-9052-31167add0da8",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5605, 202, 0],
|
||||
|
|
@ -378,7 +378,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "3498612c-357d-42f3-a1fc-89ee565569d2",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5437, 11, 0],
|
||||
|
|
@ -394,7 +394,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "36e8b3e2-c177-4b5f-a9b8-e21ac99d93e5",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5572, 113, 5],
|
||||
|
|
@ -410,7 +410,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "37cbc800-73b6-4348-a6ed-f19dea8ff7f7",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5549, 60, 0],
|
||||
|
|
@ -427,7 +427,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "38198440-cbb9-4ddb-8808-59977415fa28",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5717, 58, 5],
|
||||
|
|
@ -443,7 +443,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "3962bad0-4c7f-4fed-b4f2-e69020569bcc",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5410, 170, 0],
|
||||
|
|
@ -459,7 +459,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "3986c149-5d04-4234-9194-25d9ad0daeef",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5698, 57, 5],
|
||||
|
|
@ -475,7 +475,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "3a545713-a7cb-4e80-b41f-9eccfb8d5f35",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5730, 90, 0],
|
||||
|
|
@ -491,7 +491,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "3bc0b686-d31e-4ed6-b1bc-6236301c0d04",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5661, 16, -10],
|
||||
|
|
@ -507,7 +507,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "3cf4908c-dbae-4cb8-b48f-fdf387ecc501",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5571, 158, -10],
|
||||
|
|
@ -524,7 +524,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "3f6e1f05-7dcb-4952-8342-2c6386f057e5",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5468, 109, 35],
|
||||
|
|
@ -541,7 +541,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "49a30e76-7efb-42df-a85b-f40fd1546cee",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5448, 33, -10],
|
||||
|
|
@ -557,7 +557,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "49dbe727-8641-49ac-8372-a3f2f8fa5cf7",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5608, 190, 0],
|
||||
|
|
@ -573,7 +573,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "4a851206-2957-4090-931d-54ed78cea448",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5474, 139, 20],
|
||||
|
|
@ -589,7 +589,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "4b71965f-2829-4d76-8b31-9c6d55aa7b11",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5545, 153, 20],
|
||||
|
|
@ -605,7 +605,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "4bbcb759-e08d-45a9-b7c2-76855e283b0f",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5456, 143, 20],
|
||||
|
|
@ -621,7 +621,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "4be1fbed-a047-4092-9ed8-e5ee308123de",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5406, 177, 0],
|
||||
|
|
@ -637,7 +637,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "4fe7e9e3-3d65-433f-9c20-584fa7647e12",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5439, 137, 20],
|
||||
|
|
@ -653,7 +653,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "5036ca70-e3f4-4e5e-989e-cddf68363ace",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5595, 82, 0],
|
||||
|
|
@ -670,7 +670,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "5073e41f-2bd8-4e2b-a73a-e7ecf76a92c5",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5568, 36, 0],
|
||||
|
|
@ -686,7 +686,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "54cfd78d-c062-45de-9691-fc08b8225353",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5425, 58, 10],
|
||||
|
|
@ -703,7 +703,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "56bcaa4f-deef-4ca3-983e-461ab73c81ca",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5818, 80, 0],
|
||||
|
|
@ -719,7 +719,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "56eb182b-e842-46da-b44c-cee5290561ac",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5684, 117, 0],
|
||||
|
|
@ -735,7 +735,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "584599e2-fdf8-423b-b7b7-9e6e2cdcf45b",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5723, 77, 0],
|
||||
|
|
@ -751,7 +751,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "5a80cf5e-c29f-46d5-83e4-c622fbeba8ad",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5441, 187, 0],
|
||||
|
|
@ -760,7 +760,10 @@
|
|||
"minDelay": "00:05:00",
|
||||
"maxDelay": "00:10:00",
|
||||
"team": 0,
|
||||
"spawnBounds": { "start": { "x": 5426, "y": 172, "z": 0 }, "end": { "x": 5456, "y": 202, "z": 43 } },
|
||||
"spawnBounds": {
|
||||
"start": { "x": 5426, "y": 172, "z": 0 },
|
||||
"end": { "x": 5456, "y": 202, "z": 43 }
|
||||
},
|
||||
"walkingRange": 30,
|
||||
"entries": [
|
||||
{ "name": "EvilMage", "maxCount": 5, "probability": 100 },
|
||||
|
|
@ -768,7 +771,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "5cf37618-77d8-450d-b847-3ee1f14efcc1",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5546, 118, -5],
|
||||
|
|
@ -784,7 +787,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "5d5036ac-c3f2-48f0-8183-daca945d0523",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5398, 148, 20],
|
||||
|
|
@ -800,7 +803,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "61800760-7e33-48a1-970a-5c1c973e7398",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5468, 106, 35],
|
||||
|
|
@ -816,7 +819,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "62098bc9-596a-4f31-80a0-74190ea65a91",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5405, 185, 0],
|
||||
|
|
@ -832,7 +835,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "622a0111-2226-43de-bea6-a6e50b1a1a67",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5730, 93, 0],
|
||||
|
|
@ -848,7 +851,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "63e94588-f42b-42a6-a046-a9d4fe7a62b8",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5701, 60, 5],
|
||||
|
|
@ -864,7 +867,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "663e5aa7-2204-42a6-8b47-b4a5cdd8382e",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5492, 56, 20],
|
||||
|
|
@ -880,7 +883,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "6786e744-3a8a-4d00-8bec-213325b489b6",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5715, 61, 5],
|
||||
|
|
@ -896,7 +899,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "694e60e0-1db8-457f-b48c-d11372471f5f",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5828, 42, 0],
|
||||
|
|
@ -913,7 +916,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "6b367539-626c-44b0-a97e-8795ee947c6e",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5616, 184, 0],
|
||||
|
|
@ -929,7 +932,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "70127b13-674d-4def-86fe-bc5b90a6e88e",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5723, 73, 0],
|
||||
|
|
@ -945,7 +948,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "72cfdb5a-89de-4277-9de9-66e2c36e48fc",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5392, 10, 30],
|
||||
|
|
@ -961,7 +964,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "72d5ae48-41aa-478e-b063-23a3840b3255",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5421, 117, 0],
|
||||
|
|
@ -977,7 +980,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "746760c5-2c14-4d2c-80fe-9c1afe9a2692",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5603, 116, 0],
|
||||
|
|
@ -993,7 +996,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "7540f782-bcf5-4a5f-b2e6-ba385859a340",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5505, 180, 0],
|
||||
|
|
@ -1009,7 +1012,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "7aaac8e3-5868-41ec-b4ae-fea008e39ba5",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5575, 16, 10],
|
||||
|
|
@ -1025,7 +1028,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "7b10ba4a-f6a2-4164-827a-c7f98da29341",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5477, 183, 0],
|
||||
|
|
@ -1042,7 +1045,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "7f5f240f-d211-412b-b76d-eec1723c79fd",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5474, 20, 0],
|
||||
|
|
@ -1058,7 +1061,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "811e333f-7aa9-481f-9edf-8c61e6f984a5",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5493, 51, 20],
|
||||
|
|
@ -1074,7 +1077,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "86dc2f0d-baf0-4acc-8b9f-62a1bbbcca31",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5593, 141, 10],
|
||||
|
|
@ -1091,7 +1094,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "8d894292-aaba-4fd7-834a-68aea0d50e0a",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5404, 93, 10],
|
||||
|
|
@ -1108,7 +1111,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "90a2b066-3a4d-4627-bcd8-649434051203",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5594, 139, 10],
|
||||
|
|
@ -1124,7 +1127,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "91118d48-78d5-4fce-a97d-bd662a0bb903",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5715, 58, 2],
|
||||
|
|
@ -1140,7 +1143,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "9303d7b0-a873-47f4-b4e3-1d70d547e4b1",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5443, 36, -10],
|
||||
|
|
@ -1156,7 +1159,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "9a246364-18c8-46c3-9fac-17025f9ab620",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5399, 11, 30],
|
||||
|
|
@ -1172,7 +1175,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "9add65b7-3729-4ab6-be5f-53fc13b3fbcb",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5475, 190, 0],
|
||||
|
|
@ -1188,7 +1191,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "9b58940a-490b-4c30-8b87-69ff988cacd6",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5570, 118, 5],
|
||||
|
|
@ -1204,7 +1207,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "a01e8912-3b82-4214-a8b7-13c598cb23e0",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5701, 58, 2],
|
||||
|
|
@ -1220,7 +1223,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "a0c7b16e-fe26-4e43-ab3a-789041878480",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5469, 211, 0],
|
||||
|
|
@ -1238,7 +1241,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "a3d232dd-36fe-40f3-90b3-8e40d23c75e5",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5606, 25, 10],
|
||||
|
|
@ -1254,7 +1257,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "a40b89dc-77a6-4b5a-9f53-c7c6b75fe44b",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5415, 189, 0],
|
||||
|
|
@ -1270,7 +1273,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "a59d8de3-e39e-4d3e-84dd-b76c900d4f1f",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5845, 57, 0],
|
||||
|
|
@ -1286,7 +1289,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "a7f36503-7139-4ef4-adef-0cc2889d0e90",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5620, 21, 10],
|
||||
|
|
@ -1302,7 +1305,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "a980490d-cb4e-43dc-ad4f-1cd8c1f8846a",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5804, 12, 0],
|
||||
|
|
@ -1318,7 +1321,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "b0e7336b-58cf-43d5-bb4c-d91d0d696b72",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5725, 78, 0],
|
||||
|
|
@ -1334,7 +1337,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "b1bc56ef-b214-4b53-b49b-fe725b9d4d9f",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5733, 93, 0],
|
||||
|
|
@ -1350,7 +1353,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "b27e56f7-9157-4b01-8ddd-0aec26e185df",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5416, 59, -15],
|
||||
|
|
@ -1366,7 +1369,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "b283b315-485a-422a-a822-446e200a0080",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5434, 100, 20],
|
||||
|
|
@ -1382,7 +1385,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "b907c1ba-e6aa-4ec8-81a2-8ebc40131a7a",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5477, 67, 20],
|
||||
|
|
@ -1399,7 +1402,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "b9c97892-db29-41e5-9478-0f6d9e28e8f7",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5434, 89, 20],
|
||||
|
|
@ -1415,7 +1418,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "ba178ecf-0529-4540-9edd-710d6deb748b",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5468, 100, 35],
|
||||
|
|
@ -1431,7 +1434,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "bdfae837-0641-4ad9-ac46-23113dbe07e0",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5875, 44, 0],
|
||||
|
|
@ -1447,7 +1450,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "bffaf353-dbe8-44a7-9468-acd13b4430b7",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5752, 44, 0],
|
||||
|
|
@ -1465,7 +1468,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "c164e1f3-3128-4087-a1f5-ffcc45e5e300",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5819, 50, 0],
|
||||
|
|
@ -1482,7 +1485,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "c23758c7-2a5d-4607-b09e-de24fed379ee",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5760, 99, 0],
|
||||
|
|
@ -1500,7 +1503,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "c2a61736-5a76-4421-8178-deea7aabc615",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5394, 11, 30],
|
||||
|
|
@ -1516,7 +1519,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "c2eb38b8-d316-4f83-95f5-4c5dc6b43113",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5400, 45, 30],
|
||||
|
|
@ -1532,7 +1535,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "c327247c-da8a-412c-9e92-d960c1b91ec2",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5546, 113, -5],
|
||||
|
|
@ -1548,7 +1551,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "c3b25137-7ec8-4274-8af1-7a30f4cfaef3",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5721, 12, 10],
|
||||
|
|
@ -1564,7 +1567,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "ca52e3b4-b46b-49ec-96ca-132c5ff0b4d6",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5577, 194, 0],
|
||||
|
|
@ -1581,7 +1584,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "cad7fb39-f2aa-4f55-9899-64967860d07e",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5404, 43, 30],
|
||||
|
|
@ -1597,7 +1600,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "cc00b741-ad6a-46f6-8398-62ad6e66700a",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5856, 107, 10],
|
||||
|
|
@ -1613,7 +1616,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "ceb6c395-5f88-41cd-8d10-8a6dd7683cce",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5594, 182, 0],
|
||||
|
|
@ -1631,7 +1634,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "d1898122-15d6-4523-a6e6-84ae0cda8c6a",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5603, 93, 0],
|
||||
|
|
@ -1647,7 +1650,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "d1eed89e-ef04-4d60-812d-fea412921d76",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5549, 79, 0],
|
||||
|
|
@ -1664,7 +1667,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "d4a17766-a790-4a7b-a7d2-22d095feb615",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5456, 157, 0],
|
||||
|
|
@ -1680,7 +1683,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "d6921911-2c96-4f33-96e9-d40efa57561c",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5387, 41, 20],
|
||||
|
|
@ -1697,7 +1700,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "d92657cf-0eff-4aa3-8d6b-b11164fe85f2",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5604, 166, 0],
|
||||
|
|
@ -1713,7 +1716,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "da26e6d2-e197-479f-a3a0-2f3cd436539c",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5724, 118, 0],
|
||||
|
|
@ -1730,7 +1733,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "ddce5aba-7b2b-4d1f-b055-d242db0509c1",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5402, 58, -20],
|
||||
|
|
@ -1746,7 +1749,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "e468b283-ac85-4c27-a6e8-462a971f007c",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5699, 61, 0],
|
||||
|
|
@ -1762,7 +1765,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "f11035e3-c112-444e-9227-79c2254265b0",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5432, 158, 0],
|
||||
|
|
@ -1778,7 +1781,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "f14bf474-ef89-4f01-b3a7-0ec8aaf1f35a",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5727, 72, 0],
|
||||
|
|
@ -1794,7 +1797,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "f1a6bec6-dc10-4658-bceb-bd9ecf6970cf",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5411, 163, 0],
|
||||
|
|
@ -1812,7 +1815,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "f21c56d6-5653-4bec-95de-58b70a981ff0",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5423, 112, 0],
|
||||
|
|
@ -1828,7 +1831,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "fb19bd5b-21cf-475e-bd85-4c990c2d6596",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5474, 176, 0],
|
||||
|
|
@ -1844,7 +1847,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "Spawner",
|
||||
"$type": "Spawner",
|
||||
"guid": "fc63948f-de6d-43de-a205-6e11d44249f1",
|
||||
"name": "Spawner (219)",
|
||||
"location": [5396, 226, 10],
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue