├── README.md
├── apiclient.lua
├── client.lua
├── configuration.lua
├── island.terrain.cache.json
├── islandconfiguration.lua
├── meta.xml
├── server.lua
├── terrain.cache.json
└── textures
├── grass.png
├── sand.png
├── snow.png
└── stone.png
/README.md:
--------------------------------------------------------------------------------
1 | # Procedural world generation client
2 | This is an example resource for MTA:SA displaying procedural world generation.
3 |
4 | The generation of the .dff and .col files is done by an API.
5 | The server then caches the result for the terrain generation in `terrain.cache.json`.
6 | Deleting this file and restarting the resource will result in a new world being generated. Do note that if no settings were changed the newly generated world will be identical.
7 |
8 | `configuration.lua` contains a Lua table with configuration sent to the API.
9 | This file contains several sections of values, for specific parts of the terrain.
10 | - Root level
11 | The root level contains values specifying the size and detail of individual chunks.
12 | - Terrain
13 | This section of the configuration specifies the input variables to the noise function used to generate the height map for the terrain.
14 | - Texture
15 | The texture section contains the materials (in base 64 substrings), material scales, and the configuration for what materials to place at which height in the terrain.
16 | This also support smooth transitions between multiple materials.
17 | - Vegetation
18 | The vegetation section specifies where to place objects on the terrain.
19 | This section contains similar values to the terrain section, because this also uses a noise map to decide where to place the objects.
20 |
21 | The resource comes with a pre-configured, and pre-cached world.
22 |
23 |
--------------------------------------------------------------------------------
/apiclient.lua:
--------------------------------------------------------------------------------
1 | local storageBaseUrl = "https://renderwaremodelgenerator.blob.core.windows.net/output/"
2 | -- local storageBaseUrl = "http://127.0.0.1:10000/devstoreaccount1/output/"
3 |
4 | local apiBaseUrl = "http://renderwaremodelgenerator.azurewebsites.net/api/"
5 | -- local apiBaseUrl = "http://renderwaremodelgenerator-development.azurewebsites.net/api/"
6 | -- local apiBaseUrl = "http://localhost:7071/api/"
7 |
8 | if (triggerServerEvent) then
9 | function requestDomains()
10 | requestBrowserDomains({ apiBaseUrl, storageBaseUrl }, true)
11 | end
12 | requestDomains()
13 | end
14 |
15 | function requestTerrain(options, callback, failureCallback)
16 | local json = toJSON(options)
17 | json = json:sub(2, json:len() - 1)
18 |
19 | fetchRemote(apiBaseUrl .. "generateTerrain", {
20 | postData = json,
21 | }, function(data, info)
22 | if (info.success) then
23 | local result = fromJSON("[" .. data .. "]")
24 | callback(result.id)
25 | else
26 | failureCallback(data)
27 | end
28 | end)
29 | end
30 |
31 | function requestChunk(id, x, y, callback, failureCallback)
32 | local json = toJSON({ id = id, x = x, y = y })
33 | json = json:sub(2, json:len() - 1)
34 |
35 | fetchRemote(apiBaseUrl .. "generateChunk", {
36 | postData = json,
37 | }, function(data, info)
38 | if (info.success) then
39 | local result = fromJSON("[" .. data .. "]")
40 | callback(result.id)
41 | else
42 | failureCallback(data)
43 | end
44 | end)
45 | end
46 |
47 | function requestChunks(id, positions, callback, failureCallback)
48 | local json = toJSON({
49 | id = id,
50 | chunks = positions
51 | })
52 | json = json:sub(2, json:len() - 1)
53 |
54 | fetchRemote(apiBaseUrl .. "generateChunks", {
55 | postData = json,
56 | }, function(data, info)
57 | if (info.success) then
58 | local result = fromJSON("[" .. data .. "]")
59 | callback(result.ids)
60 | else
61 | failureCallback(data)
62 | end
63 | end)
64 | end
65 |
66 | function getDffIfExists(id, callback, failureCallback, retryCount)
67 | requestIfExists(storageBaseUrl .. id .. ".dff", callback, failureCallback, retryCount or 0)
68 | end
69 |
70 | function getTxdIfExists(id, callback, failureCallback, retryCount)
71 | requestIfExists(storageBaseUrl .. id .. ".txd", callback, failureCallback, retryCount or 0)
72 | end
73 |
74 | function getColIfExists(id, callback, failureCallback, retryCount)
75 | requestIfExists(storageBaseUrl .. id .. ".col", callback, failureCallback, retryCount or 0)
76 | end
77 |
78 | function getVegetationIfExists(id, callback, failureCallback, retryCount)
79 | requestIfExists(storageBaseUrl .. id .. ".vegetation.json", function(data)
80 | callback(fromJSON("[" .. data .. "]"))
81 | end, failureCallback, retryCount or 0)
82 | end
83 |
84 | function requestIfExists(url, callback, failureCallback, retryCount, retryTimer)
85 | local retryTimer = retryTimer or 1000
86 | fetchRemote(url, {
87 | method = "GET"
88 | }, function (data, info)
89 | if (info.success) then
90 | callback(data, info)
91 | else
92 | if (retryCount > 0) then
93 | setTimer(function() requestIfExists(url, callback, failureCallback, retryCount - 1, retryTimer * 2) end, retryTimer, 1)
94 | else
95 | failureCallback(data)
96 | end
97 | end
98 | end)
99 | end
--------------------------------------------------------------------------------
/client.lua:
--------------------------------------------------------------------------------
1 | local modelStart = 2059
2 | local modelDistanceCache = {}
3 |
4 | function loadChunk(x, y, dff, col, txd, vegetation)
5 | if (dff and col and txd and vegetation) then
6 | print("Loading chunk at " .. x .. ", " .. y)
7 | local objectModel = modelStart
8 | modelStart = modelStart + 1
9 |
10 | local col = engineLoadCOL(col)
11 | local txd = engineLoadTXD(txd)
12 | local dff = engineLoadDFF(dff)
13 |
14 | engineReplaceCOL(col, objectModel)
15 | engineImportTXD(txd, objectModel)
16 | engineReplaceModel(dff, objectModel)
17 |
18 | engineSetModelLODDistance(objectModel, 3000)
19 | local object = createObject(objectModel, x, y, heightOffset)
20 | local lod = createObject(objectModel, x, y, heightOffset, 0, 0, 0, true)
21 | setLowLODElement(object, lod)
22 |
23 | for key, model in pairs(vegetation) do
24 | setTimer(function()
25 | engineSetModelLODDistance(model.Model, 100)
26 | local main = createObject(model.Model, x + model.Position.X, y + model.Position.Y, model.Position.Z + heightOffset, model.Rotation.X, model.Rotation.Y, model.Rotation.Z)
27 | local lod = createObject(model.Model, x + model.Position.X, y + model.Position.Y, model.Position.Z + heightOffset, model.Rotation.X, model.Rotation.Y, model.Rotation.Z, true)
28 | setLowLODElement(main, lod)
29 |
30 | local mainX, mainY, mainZ = getElementPosition(main)
31 | if (modelDistanceCache[model.Model] == nil) then
32 | modelDistanceCache[model.Model] = getElementDistanceFromCentreOfMassToBaseOfModel(main)
33 | end
34 | local offset = modelDistanceCache[model.Model]
35 | setElementPosition(main, mainX, mainY, mainZ + offset)
36 | setElementPosition(lod, mainX, mainY, mainZ + offset)
37 | end, key * 50, 1)
38 | end
39 | end
40 | end
41 |
42 | function requestChunk(id, x, y)
43 | local dff
44 | local col
45 | local txd
46 | local vegetation
47 |
48 | getDffIfExists(id, function(result)
49 | dff = result
50 | loadChunk(x, y, dff, col, txd, vegetation)
51 | end, function()
52 | outputDebugString("Failed to get chunk " .. id .. " dff")
53 | end, 16)
54 |
55 | getTxdIfExists(id, function(result)
56 | txd = result
57 | loadChunk(x, y, dff, col, txd, vegetation)
58 | end, function()
59 | outputDebugString("Failed to get chunk " .. id .. " txd")
60 | end, 16)
61 |
62 | getColIfExists(id, function(result)
63 | col = result
64 | loadChunk(x, y, dff, col, txd, vegetation)
65 | end, function()
66 | outputDebugString("Failed to get chunk " .. id .. " col")
67 | end, 16)
68 |
69 | getVegetationIfExists(id, function(result)
70 | vegetation = result
71 | loadChunk(x, y, dff, col, txd, vegetation)
72 | end, function()
73 | outputDebugString("Failed to get chunk " .. id .. " vegetation")
74 | end, 16)
75 | end
76 | addEvent("generation.loadChunk", true)
77 | addEventHandler("generation.loadChunk", getRootElement(), requestChunk)
--------------------------------------------------------------------------------
/configuration.lua:
--------------------------------------------------------------------------------
1 | local function getFileBase64(filepath)
2 | if (triggerClientEvent) then
3 | local file = fileOpen(filepath)
4 | local content = fileRead(file, fileGetSize(file))
5 | fileClose(file)
6 |
7 | local base64 = base64Encode(content)
8 |
9 | local segments = {}
10 | while (base64:len() > 65535) do
11 | segments[#segments + 1] = base64:sub(1, 65535)
12 | base64 = base64:sub(65535 + 1)
13 | end
14 | segments[#segments + 1] = base64
15 | return segments
16 | end
17 | return {}
18 | end
19 |
20 | chunkRange = 2
21 | waterHeight = -0.3;
22 | heightOffset = 150
23 |
24 | terrainConfiguration = {
25 | ChunkWidth = 400,
26 | ChunkHeight = 400,
27 | ChunkDelta = 8.0,
28 | Terrain = {
29 | Seed = 1,
30 | Octaves = 3,
31 | Lacunarity = 2.0,
32 | Gain = 0.4,
33 | Frequency = 0.001,
34 | HeightMultiplier = 100
35 | },
36 | Texture = {
37 | Width = 1280,
38 | Height = 1280,
39 | Materials = {
40 | getFileBase64("textures/sand.png"),
41 | getFileBase64("textures/grass.png"),
42 | getFileBase64("textures/stone.png"),
43 | getFileBase64("textures/snow.png"),
44 | },
45 | MaterialScaleFactors = {
46 | 1,
47 | 1,
48 | 1,
49 | 1
50 | },
51 | MaterialOptions = {
52 | {
53 | min = -0.5,
54 | max = -0.275,
55 | from = 0
56 | },
57 | {
58 | min = -0.275,
59 | max = -0.225,
60 | from = 0,
61 | to = 1
62 | },
63 | {
64 | min = -0.225,
65 | max = -0.025,
66 | from = 1
67 | },
68 | {
69 | min = -0.025,
70 | max = 0.025,
71 | from = 1,
72 | to = 2
73 | },
74 | {
75 | min = 0.025,
76 | max = 0.225,
77 | from = 2
78 | },
79 | {
80 | min = 0.225,
81 | max = 0.275,
82 | from = 2,
83 | to = 3
84 | },
85 | {
86 | min = 0.275,
87 | max = 0.5,
88 | from = 3
89 | }
90 | }
91 | },
92 | Vegetation = {
93 | Delta = 2,
94 | VegetationSets = {
95 | {
96 | Seed = 2,
97 | Octaves = 3,
98 | Lacunarity = 2,
99 | Gain = 0.5,
100 | Frequency = 0.03,
101 |
102 | objectRanges = {
103 | {
104 | minNoise = 0.4895,
105 | maxNoise = 0.49,
106 | minHeight = -0.225,
107 | maxHeight = -0.025,
108 | models = { 690, 693, 694, 698, 790, 791 }
109 | },
110 | {
111 | minNoise = 0.409,
112 | maxNoise = 0.41,
113 | minHeight = -0.225,
114 | maxHeight = -0.025,
115 | models = { 705, 706, 709 }
116 | },
117 | {
118 | minNoise = 0.309,
119 | maxNoise = 0.31,
120 | minHeight = -0.225,
121 | maxHeight = -0.025,
122 | models = { 615, 617, 764, 766, 768, 773 }
123 | },
124 | {
125 | minNoise = 0.209,
126 | maxNoise = 0.21,
127 | minHeight = -0.225,
128 | maxHeight = -0.025,
129 | models = { 672, 700, 729, 780, 779, 782, 781 }
130 | },
131 | {
132 | minNoise = 0.108,
133 | maxNoise = 0.11,
134 | minHeight = -0.225,
135 | maxHeight = -0.025,
136 | models = { 647, 728, 759, 760, 762, 800, 801, 802, 803, 805, 808, 809, 810, 811, 812, 813, 814, 815, 874}
137 | }
138 | }
139 | }
140 | }
141 | }
142 | }
--------------------------------------------------------------------------------
/island.terrain.cache.json:
--------------------------------------------------------------------------------
1 | [ { "id": "dc7b92f2-dbf3-4d09-b1dd-7d6154ca2721", "chunks": { "-3200X-2800": "0267879a-de3d-441a-a885-591b3f088aab", "-2800X-2800": "ff4f48b6-4fe0-46b7-85b4-bfb7842b87fc", "400X400": "4ceca98a-7f4c-43e3-9f6d-96327674ea64", "-800X-1200": "bccf4099-8134-4882-83cd-cf06f2a944f6", "-1200X-400": "0b0e4612-4d70-4a07-a7d5-d0dfa8cc5bf1", "-2000X-2800": "3e997663-3e78-4272-8425-c096b9d2da62", "-2400X-2400": "9de92a4a-0a8f-431f-99fe-914ee99c16d8", "800X400": "914a9537-a7b4-455b-8fb2-aa5e23af4db2", "-6000X-2400": "9dc80ab3-e5e5-4faa-8452-5ad997205439", "-1600X-400": "b308ea4c-b964-4af8-b083-6faaf3fab6a0", "400X-800": "4378a1d4-a6f8-4453-9bf9-13ff286204c7", "-2000X-2000": "0affe4bb-6c95-4edd-90f2-cff0bbcb8fbe", "800X-800": "33d15efa-e205-4239-b3e2-179f5a522727", "-2800X-2400": "b5e37ec4-41e1-4627-bf99-01622d9e8475", "-2800X-4000": "5d44472a-0da8-475b-b6f0-99eed845348f", "-2000X-1200": "30a94982-88b7-4bfb-bfa4-ef793edb2b0e", "-4000X-3600": "5248a94d-4b5f-4a7f-ac45-c18b108aa313", "-2800X-800": "1918683a-cb96-45e3-b87d-fc7c086d86cb", "-2800X-1200": "2c9fc67c-5930-4e9f-9b48-9a77f021edc6", "-2400X-1600": "2e2160b8-c289-45e3-94d1-6a15e7670d76", "-1600X-2400": "f351e4db-a7f2-4544-8867-26569e4ddf3a", "-4800X-4400": "d09bb869-494c-4cef-beb6-836bb7af3120", "-1600X-1200": "6aff686b-ce19-42d7-98d0-4ac845e03a6d", "-4000X-3200": "863b1147-1463-4b98-a2f7-f54624af05ee", "-1600X-800": "771c307e-5b95-44d8-b33b-5f80d0932026", "-5600X-4000": "eec1a8b6-8fb6-42fc-8124-4f6893d0529b", "-4000X-4400": "d1cf10ff-f460-4c00-9421-31ccafc01461", "-3600X-2800": "3edf2e10-5c8b-42f4-adc9-13df1507380e", "-400X400": "e7a28179-3137-4cff-ba59-486b3eef794c", "0X-1200": "92dc9c0e-22e0-4402-96af-2089fd23a9bd", "-4800X-2800": "0da77be6-ff90-495d-945f-fa884d388c3d", "-4000X-2800": "0e1c8f99-751c-4eb1-b20e-93c164c11ca8", "-4000X-2000": "25b1aaba-fa39-4559-8cd7-ed98ce9aca77", "-4400X-2400": "b34687b1-5a84-4683-a752-4933dad73ff5", "-3200X-400": "c0a09bde-0c44-491a-9741-ba60f48d87f1", "-4800X-2400": "c8785004-55f1-4b62-8a68-b5f1285cd6b4", "-400X-800": "304bf22a-e9db-4d39-afde-e049810274b4", "-3600X-3200": "c39a619b-3bf0-417a-b5fb-f5c44bccd21c", "-5600X-4400": "c243e0e1-941a-4944-9014-46e04bd1f480", "-4400X-3600": "6cca3ef8-1f44-4f76-bd54-8d2ea3f46036", "-4800X-4000": "0d2499e8-b052-4f74-8500-6e7162cce8e7", "-2800X-3200": "c14bbedd-7408-438b-94a3-c7fb6d406319", "-3200X-2400": "beb8bece-03a2-405e-b4de-3c7ebce239c2", "-800X-400": "e73a3c1b-a984-4708-b6d4-fe86fefa7b01", "-2400X-400": "dbd9e24a-2499-43f8-9d4b-ad2e21c59bb6", "-5200X-4400": "2217c92d-1a11-4030-8c1b-b9d3b55f6047", "-400X-400": "7941190c-00d7-43cf-ad01-5c5ad00ccd4c", "-1200X-2000": "1de9d97f-4ca1-4f33-939a-091ac1280de3", "-4000X-1200": "db0a6016-6842-4e4e-bcb4-359130313d35", "-2000X-400": "201b6a8b-0a73-439e-b044-571598822a37", "-4000X-4000": "421c9a2e-9fef-490a-a853-963dc50635cc", "-3600X-1200": "931de763-766b-4609-a8aa-4b2dcc31072f", "-3600X-3600": "681fbff4-14e2-42d8-ba9d-8859cf8321d9", "0X400": "f018fca0-e5d6-442c-a323-59e336bcd8e8", "-1200X-1200": "5a9e62d2-6e58-442b-ab3f-40f98ad04202", "-400X0": "62ee25f4-a70c-477c-b83d-c19d57cf1b1d", "-400X800": "f67f9249-04df-466d-9d3f-76a92d6a214e", "-3200X-1600": "110a8083-1bd1-4e81-a0a2-51fa7a8638ea", "-6000X-3200": "4f088e36-7258-433b-b0a2-240ee551334d", "-1200X800": "a05fd3b4-dc90-4768-8d45-742b2b6572e4", "-1200X0": "516bc882-d820-4928-a49e-b77f7afe888b", "-2000X-1600": "6e9b0d10-d7dc-4d6b-8526-a446a545a1cd", "0X-400": "d826e523-9f98-4d09-9a13-b6f9be304e7b", "-5600X-2800": "de7954e7-071c-44e6-a235-a8394b7e38a5", "-2000X-2400": "7c295cfb-8982-4b8b-b21b-40f00e0ff341", "-2800X-2000": "2ef6a643-b016-4223-90ed-a2be6517a355", "400X800": "90917399-ca59-49d7-bb4a-054d65727776", "800X800": "936af216-5ed5-4cdd-9fd4-32082d7b640a", "-800X-1600": "975c6a00-53a1-4a75-a930-87f2904c2463", "-6000X-2800": "37433e02-b388-4ee8-b205-bc99eaec1825", "-3200X-3600": "0446eb64-37eb-4c00-a993-8cab368046ba", "-5600X-3200": "2b28f99e-2097-47b9-b2b0-b7cc7a007224", "-2000X-800": "8d2fb42c-9197-46d7-a748-84d7ac258030", "-5600X-2400": "ce97b6b3-5b9c-4f0f-b343-f31ba9e8b9e1", "-4800X-3200": "533eeb8d-3fd2-4967-950d-b589fcdabbb5", "-1600X-2000": "c11d9b1b-da86-446e-a1a8-540066af2f45", "0X-800": "6fc6b3a2-ce92-4a3b-b895-e432f3fea64e", "400X-400": "f351ac93-bf95-4f4b-be65-faaa3eef25de", "-3200X-4400": "2b172931-8d13-422c-b297-643a1620b38a", "-4800X-3600": "ea50b1dc-23c8-4228-a3f1-49b7eb53e371", "-6000X-4000": "c8431e28-a1e6-40e6-aace-8ceffcac2d0b", "-3200X-2000": "073b5bb3-cc28-4e8e-8499-6735384c940c", "-3200X-1200": "93e7184a-1543-4097-93c4-1d7dc48e4c9c", "-2400X-3200": "50890058-6876-4b6a-bc22-b2a883c326c1", "-3200X-800": "bc86f475-79b9-4214-82bf-d3155b296b76", "800X-400": "9ade245f-e45c-47c6-ae33-752755faf3f7", "-3200X-4000": "e999616e-607d-4c3f-9db3-a9313ad11b1c", "-4400X-4400": "bd4d2324-73ff-4bd9-a550-e1201aad3ff8", "-1200X-1600": "3c270264-2d64-40a4-bad2-5ffa8d55fd59", "-800X400": "5b84e6a6-99ca-4e65-9d83-5a1d1047f163", "-1600X0": "618a3b11-4723-41b0-aaab-05c19173ae4b", "400X0": "d5d5fc53-8aee-431c-83d6-6c280a63fd95", "-2000X400": "ff6880b7-f818-4b45-969e-0d2543879fdd", "-800X-800": "3b136482-2840-44b6-a548-a6d493f11c2c", "-2400X-2800": "56783887-6eae-43ee-8b18-bcaa7de26cd4", "-2400X-2000": "2fe7b0d4-8c59-4761-aa9f-4faa0399da22", "-4000X-2400": "dc6f6949-e0ab-4bd1-8bc7-7a8849ea1c0f", "-5200X-2400": "3ba2dd56-7880-4265-a6cc-e4eb96b8f5c0", "-1600X400": "434f1d4e-77e3-4230-a50c-f6b26b9d519d", "-6000X-4400": "a2b21ff0-9f02-410e-980c-b479ee5a4ef4", "-5600X-3600": "fd9790cb-8c7a-453d-adcb-5c968188bbaa", "800X0": "57103357-a8a9-4013-9293-940a76986635", "-3600X-4000": "d9994278-59ec-40b8-a303-7532c717c486", "-5200X-2800": "5cc6c8f0-3500-4448-a168-ff2033474961", "400X-1200": "432ab6fa-7164-4e51-8742-b5290814386f", "-5200X-3600": "138759ae-2b34-4a6c-8190-2f4bf49de2cb", "-2000X0": "a7bceb4a-b15c-4bc6-90e1-023b4ac7bc38", "-2400X0": "db3cab5e-4b99-4f31-aced-ad9ea78c5e65", "-2400X-1200": "f04330b9-940d-4040-bb0c-5d66879081b6", "-4400X-2800": "6e414892-0b06-446f-831f-60b6e8cade81", "-3600X-4400": "5b9ff7a5-0959-4272-b22d-373dd919045f", "-2800X-1600": "277c35b8-6328-40cf-a401-43e6fbcb2201", "-2400X-800": "cde1abd8-4377-440d-9441-90c88e41bce8", "-6000X-3600": "897b5c5a-8cbe-48d5-972f-d508a3541927", "0X800": "61f9f0ee-6a21-4fd4-8033-b18476d15160", "-400X-1600": "c25f9c3f-49bd-4127-a529-7d8042f78890", "-3200X-3200": "55f20853-a10c-4356-a75c-806fff6f4c82", "-4400X-4000": "48402e5d-5245-4b2d-8825-21d106a06d87", "-2800X-400": "9ec653d2-bc92-44da-869c-1da197bd4e24", "0X0": "0e5a0671-090f-499e-92dd-417861b7be8c", "-3600X-2000": "67fd4989-8f64-470d-9588-2e54baa410ee", "-2800X-3600": "83b8df54-b109-402c-a76b-0e934774a4d0", "-5200X-3200": "3f8d2e43-8b1b-491b-97f3-0f7406e60b05", "-2400X-4000": "958bcf15-36f6-469d-8d0f-6f452bdfb2de", "-4400X-3200": "0eddebb0-6124-4e7a-9dac-df66317aa43c", "-800X0": "45798245-1701-4f94-a15a-190e32db96f8", "-2400X-3600": "7f6132ec-5191-4202-a186-39a199930405", "-1600X800": "9a330802-c405-494a-bd5a-b1839839f909", "-400X-1200": "1edbd5f0-5e1a-4d6a-97f9-7e91a7d9e7d1", "-800X800": "95b6e556-14a7-45ec-8b1e-2eabe112e5ca", "-2800X0": "8d0c49a6-6a2c-4f2f-b61c-24044bd83e5f", "-4000X-1600": "de251ddc-145e-4c7d-b6b1-3ce14eec4f42", "-1200X400": "0828c75c-0feb-4e95-b42f-dc744699389f", "-1600X-1600": "52f8e94e-12a4-4488-8df2-a14b57d6ed3d", "-3600X-800": "ffce309a-7631-4133-8e5c-6855124a1c74", "-5200X-4000": "558cd729-943b-47fd-bd4d-fa9a60c93e1c", "-3600X-1600": "29b0781e-86db-4125-912a-abd1b74ea898", "-3600X-2400": "d2987748-2da0-4a57-a983-5e756b1ab60c", "-1200X-800": "039a36d2-de4a-4919-a3c2-985968e53fb3" } } ]
--------------------------------------------------------------------------------
/islandconfiguration.lua:
--------------------------------------------------------------------------------
1 | local function getFileBase64(filepath)
2 | local file = fileOpen(filepath)
3 | local content = fileRead(file, fileGetSize(file))
4 | fileClose(file)
5 |
6 | local base64 = base64Encode(content)
7 |
8 | local segments = {}
9 | while (base64:len() > 65535) do
10 | segments[#segments + 1] = base64:sub(1, 65535)
11 | base64 = base64:sub(65535 + 1)
12 | end
13 | segments[#segments + 1] = base64
14 | return segments
15 | end
16 |
17 | chunkRange = 2
18 | waterHeight = 0;
19 | heightOffset = 0
20 |
21 | terrainConfiguration = {
22 | ChunkWidth = 400,
23 | ChunkHeight = 400,
24 | ChunkDelta = 8.0,
25 | Terrain = {
26 | Seed = 5,
27 | Octaves = 3,
28 | Lacunarity = 3.0,
29 | Gain = 0.4,
30 | Frequency = 0.001,
31 | HeightMultiplier = 250
32 | },
33 | Texture = {
34 | Width = 1600,
35 | Height = 1600,
36 | Materials = {
37 | getFileBase64("textures/sand.png"),
38 | getFileBase64("textures/grass.png"),
39 | getFileBase64("textures/stone.png"),
40 | getFileBase64("textures/snow.png"),
41 | },
42 | MaterialScaleFactors = {
43 | 1,
44 | 1,
45 | 1,
46 | 1
47 | },
48 | MaterialOptions = {
49 | {
50 | min = -0.5,
51 | max = 0.00,
52 | from = 0
53 | },
54 | {
55 | min = 0.00,
56 | max = 0.050,
57 | from = 0,
58 | to = 1
59 | },
60 | {
61 | min = 0.050,
62 | max = 0.5,
63 | from = 1
64 | },
65 | }
66 | },
67 | Vegetation = {
68 | Delta = 2,
69 | VegetationSets = {
70 | {
71 | Seed = 2,
72 | Octaves = 3,
73 | Lacunarity = 2,
74 | Gain = 0.5,
75 | Frequency = 0.03,
76 |
77 | objectRanges = {
78 | {
79 | minNoise = 0.48955,
80 | maxNoise = 0.49,
81 | minHeight = 0.08,
82 | maxHeight = 0.5,
83 | models = { 690, 693, 694, 698, 790, 791 }
84 | },
85 | {
86 | minNoise = 0.4095,
87 | maxNoise = 0.41,
88 | minHeight = 0.08,
89 | maxHeight = 0.5,
90 | models = { 705, 706, 709 }
91 | },
92 | {
93 | minNoise = 0.3095,
94 | maxNoise = 0.31,
95 | minHeight = 0.08,
96 | maxHeight = 0.5,
97 | models = { 615, 617, 764, 766, 768, 773 }
98 | },
99 | {
100 | minNoise = 0.2095,
101 | maxNoise = 0.21,
102 | minHeight = 0.08,
103 | maxHeight = 0.5,
104 | models = { 672, 700, 729, 780, 779, 782, 781 }
105 | },
106 | {
107 | minNoise = 0.1085,
108 | maxNoise = 0.11,
109 | minHeight = 0.08,
110 | maxHeight = 0.5,
111 | models = { 647, 728, 759, 760, 762, 800, 801, 802, 803, 805, 808, 809, 810, 811, 812, 813, 814, 815, 874}
112 | }
113 | }
114 | }
115 | }
116 | }
117 | }
--------------------------------------------------------------------------------
/meta.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/server.lua:
--------------------------------------------------------------------------------
1 | local cacheFileName = "terrain.cache.json"
2 | local cache = {
3 | chunks = {}
4 | }
5 | local generatingChunks = {}
6 | local generatingPlayers = {}
7 |
8 | function loadCache()
9 | if fileExists(cacheFileName) then
10 | local file = fileOpen(cacheFileName)
11 | local content = fileRead(file, fileGetSize(file))
12 | fileClose(file)
13 | cache = fromJSON(content)
14 | else
15 | requestTerrain(terrainConfiguration, function(id)
16 | cache.id = id
17 | end, function (data)
18 | outputDebugString("Unable to generate terrain", 1)
19 | outputDebugString(data, 1)
20 | end)
21 | end
22 | end
23 |
24 | function saveCache()
25 | local file
26 | if fileExists(cacheFileName) then
27 | file = fileOpen(cacheFileName)
28 | else
29 | file = fileCreate(cacheFileName)
30 | end
31 | fileWrite(file, toJSON(cache))
32 | fileClose(file)
33 | end
34 |
35 | function generateChunk(x, y)
36 | if cache.id == null then
37 | outputDebugString("Unable to generate chunk, terrain id does not yet exist", 2)
38 | return
39 | end
40 | local identifier = x .. "X" .. y
41 | if (generatingChunks[identifier] == nil) then
42 | generatingChunks[identifier] = true
43 | outputDebugString("Generating " .. identifier)
44 | requestChunk(cache.id, x, y, function(id)
45 | outputDebugString("Chunk generation successful")
46 | cache.chunks[identifier] = id
47 | generatingChunks[identifier] = nil
48 | saveCache()
49 | end, function()
50 | outputDebugString("Chunk generation failed " .. identifier, 2)
51 | generatingChunks[identifier] = nil
52 | end)
53 | end
54 | end
55 |
56 | function checkGenerationForPlayer(player)
57 | local x, y, z = getElementPosition(player)
58 |
59 | local width = terrainConfiguration.ChunkWidth
60 | local height = terrainConfiguration.ChunkHeight
61 |
62 | local roundedX = math.floor(x / width + 0.5) * width
63 | local roundedY = math.floor(y / height + 0.5) * height
64 |
65 | for generateX = -chunkRange, chunkRange do
66 | for generateY = -chunkRange, chunkRange do
67 | local identifier = (roundedX + generateX * width) .. "X" .. (roundedY + generateY * height)
68 | if (cache.chunks[identifier]) then
69 | if (generatingPlayers[player][identifier] == nil) then
70 | generatingPlayers[player][identifier] = true
71 | triggerClientEvent(player, "generation.loadChunk", player, cache.chunks[identifier], roundedX + generateX * width, roundedY + generateY * height)
72 | end
73 | else
74 | generateChunk(roundedX + generateX * width, roundedY + generateY * height)
75 | end
76 | end
77 | end
78 | end
79 |
80 | function checkGeneration()
81 | for player, _ in pairs(generatingPlayers) do
82 | checkGenerationForPlayer(player)
83 | end
84 | end
85 |
86 | function stopGenerating()
87 | generatingPlayers[source] = nil
88 | end
89 |
90 | function startGenerating(player)
91 | setElementPosition(player, 0, 0, 320)
92 | local vehicle = createVehicle(495, 0, 0, 320)
93 | setVehicleDamageProof(vehicle, true)
94 | warpPedIntoVehicle(player, vehicle)
95 | generatingPlayers[player] = {}
96 | checkGenerationForPlayer(player)
97 |
98 | addEventHandler("onPlayerQuit", player, stopGenerating)
99 | end
100 | addCommandHandler("generate", startGenerating)
101 |
102 | function init()
103 | for i = 550, 20000 do
104 | removeWorldModel(i, 10000, 0, 0, 0)
105 | end
106 | setOcclusionsEnabled(false)
107 |
108 | local heightMultiplier = terrainConfiguration.Terrain.HeightMultiplier
109 | createWater(
110 | -2998, -2998, heightOffset + waterHeight * heightMultiplier,
111 | 2998, -2998, heightOffset + waterHeight * heightMultiplier,
112 | -2998, 2998, heightOffset + waterHeight * heightMultiplier,
113 | 2998, 2998, heightOffset + waterHeight * heightMultiplier
114 | )
115 |
116 | loadCache()
117 |
118 | setTimer(checkGeneration, 2 * 1000, 0)
119 | end
120 | init()
--------------------------------------------------------------------------------
/terrain.cache.json:
--------------------------------------------------------------------------------
1 | [ { "id": "17327230-f4e2-4549-97e7-dbff7fc4de8d", "chunks": { "-3200X-2800": "b4559daa-6a00-4a9b-82ea-0298014389e5", "-1600X-2800": "96fbcac2-b55d-4e17-8292-b6039c944465", "-400X-3200": "19c800dc-84f7-47a9-b9ac-5e2f443007bd", "400X400": "c6d3559c-27e2-4889-8892-7494a7457077", "-800X-1200": "b3096ce1-9355-4a38-bc84-8ea17169ae35", "-1200X-400": "cac33249-1bea-400c-9bc4-9f59bcac01d2", "400X2000": "c4672878-783c-4371-bb53-0e6ed2c666d5", "-2000X-2800": "cb218fb9-6b25-483d-92f8-ced2d01dc025", "1200X-2000": "a962b720-b0c9-4ca0-a6f1-2633924f765e", "-2400X-2400": "a18b6156-7168-4f7e-82e1-4b8a272a33c3", "800X400": "7b3e3fc4-8a39-4173-aafe-625d8679f0e0", "0X2400": "b57a9075-ccd5-4825-8c74-0937ef981dd6", "-3200X2800": "74f95c44-399b-4bf0-93be-8a1be8b566cd", "-2000X-2000": "10591ddd-c990-4033-a66a-5966327a6b62", "-2800X-2400": "243ce2cc-e54d-4fa0-aab6-04277e6f8d48", "-2800X-4000": "36e26941-4e71-4454-9221-a89abbbf7597", "-2000X-1200": "81b7af7d-db80-460d-983b-bdbabde5cc6a", "-2000X2800": "ff7ae7ac-a80d-4c2d-a2ff-7fbf86caa8ff", "-4000X-3600": "b54682ce-6313-4779-9dfe-4a45cc450e1f", "-2800X-800": "561e4bc3-f869-4c5e-ad94-14423f9a4327", "-2400X-1600": "cfdfe190-568c-4d15-ba18-fadbac5fd356", "-800X2400": "025e3d08-6c19-41dd-b18a-cb8acd732186", "-1600X-2400": "a41600a0-c348-4cf0-be3b-14531ff6fdcd", "400X-2800": "3c4a4934-fd63-4ef5-96f8-d75a6f36ab4a", "1200X800": "13571042-9c7f-4d3d-8fd9-7291a66792ce", "-3600X4000": "f0405d76-9f5c-4af9-9b41-e454aa265348", "800X-2800": "7343a457-63a7-42c8-ae41-4b2cef7cfff0", "-1600X-800": "b01b51e3-7cdc-403d-b871-e38d5d43d59b", "400X1200": "f92a0b08-1730-4a7e-81f3-79a625f82877", "-3600X-2800": "16dda3e4-3787-427a-896e-0bd79d44c566", "0X2000": "a12e7542-3cc1-4aa4-a650-6c91a0955d4b", "0X-1200": "1750889e-768e-45ee-b1ff-56c8521bb139", "-1200X1600": "6f0a2bf5-b40f-4ccf-88b7-18b894905a21", "-4000X-2800": "fc360bca-fdf1-4af9-bf71-cabc16c4988c", "400X3600": "64c235f5-44ea-4217-b59b-418f3af46ec0", "-4000X-2000": "c19594f1-47c2-4418-a546-a500476e16f6", "2000X-2000": "2f995b60-fc55-43a6-9289-f2cb926e84c2", "-2400X1600": "e227b85d-cf3f-424b-b3d2-da350af9d777", "-400X-800": "b09f5c8d-661c-4f09-befe-973958d934f0", "-3200X3200": "50d75ad8-fff2-4aea-8f89-37b18fa245c2", "-4000X-800": "90c22461-9722-47eb-8d5c-6257667e2fed", "1600X-1600": "f55abb03-ea13-4534-b940-4e2c25717c9b", "-2400X2800": "af0544e4-f728-4b20-bf6a-b4d5deceae70", "-800X-400": "f8aea683-492d-4a44-a8ec-417837c7f87d", "0X3600": "1998a531-3230-470c-b922-b2f8d3ac461d", "-1200X-2000": "06c028ac-b0dd-4c4a-8d0f-b2df36c09e5d", "-2000X-3600": "27029e36-92ac-481e-9562-a1c6933da078", "-400X800": "a78130f6-e6dd-4a07-8f62-bbe24c50be9d", "-800X1200": "c2ef0622-4fca-403b-b4fe-862afcf5b756", "-1200X800": "a1e50001-f47c-4909-8c57-c13b6f4d04aa", "400X-3200": "109b3730-1979-402d-abc8-c2938798a2ec", "-3200X2400": "209e9431-cd52-4671-8fe8-71ce3eb6f390", "0X-400": "8fe362b0-8bae-4df4-9ef7-8cce60f9462e", "1200X400": "9a8d48c1-7bbf-495f-b616-57b5daa50090", "-2400X2400": "928361cd-5f69-41d9-a55a-bac28494c313", "1600X-800": "a576ddbb-277b-4a9b-b478-8f6999e42114", "-2800X-2000": "f7ccd7d5-57f6-439b-8000-bb992be83e67", "400X800": "184b12fa-b9a0-4735-99bd-5cf2580ca0f4", "800X800": "e9a786b8-df61-4b3d-8c7b-4b53ef6f07e3", "-800X-1600": "46d3f4be-7bbf-4a87-b78e-3d9205f5a9d9", "-4000X3600": "d7ed7a14-0de0-4559-92c7-4818110aebb0", "0X2800": "4de0a8ca-0963-4220-96d9-7a2cd7bda581", "800X-3200": "633cd1d1-bcfc-4613-9f36-4fdcd6bda6b9", "-3200X-3600": "9b4e85ab-ca97-431e-8c76-f0299cb08d3e", "-800X-2800": "0ab1f90f-5a08-406b-9662-2b421a7435d0", "-2000X-800": "6fa79118-c5c1-43ba-b81a-6b8ef04e9e1c", "0X-800": "42e10d02-afb4-4190-9267-63c9334502de", "400X-400": "63641822-35a5-458b-b9d5-9c772e74948b", "-4000X-400": "0d95918b-c655-4c57-a635-04f2d4c3718c", "-3200X-2000": "0430d207-2f0b-465e-b972-2b6c023cee48", "1200X-400": "dd689bdd-3858-45c0-b2c0-3936ee857ca8", "-3600X400": "29a57c82-5896-49e1-82b4-6712658a761b", "-3600X-1600": "1f4084c6-b759-4eef-bafa-1046b905e266", "1600X0": "5e96fbe5-1d6a-4d61-b870-7e57daaeddc7", "-3200X1600": "71e5567a-2eca-4b01-9524-fcc3cc96c363", "800X-1200": "40567888-92fb-481d-baaa-f32c6612b05a", "0X800": "52a5d8bb-9b37-4c15-8346-a135cee99e76", "400X2800": "e6d155f8-33b5-425a-891d-2afe25d7cb03", "1600X800": "6ed03822-d663-48cd-b7cb-13bf406dd517", "-3200X-4000": "120b8c16-84ae-45ea-a38b-918f72632e24", "2400X400": "d1ecb5eb-6274-4ffa-8b4a-3f933d017235", "-1200X-1600": "58520fa8-0192-4102-bde0-ea610e9a8ee3", "-3200X800": "dc142dfc-eb8f-4aed-962b-80099eb179f7", "-2800X4000": "af843a89-0c73-4acb-b38c-ea894526585b", "-3200X0": "e0d98bdf-dc78-401f-a241-2938cd827ead", "0X-2000": "a51e3f02-8282-4841-807e-18daf292eee9", "2000X400": "0ff4feb5-f0c3-41a9-b02d-00922bce27bc", "-2400X-2800": "b42015bb-807d-4cf4-893d-c21bac446b96", "2000X-800": "a8f36193-a9a6-4cb3-a9b8-7cc27cc05946", "-2400X3200": "fe7335c4-24fe-4c67-8fc5-96af1856dc53", "-2400X-2000": "859fec81-2935-4537-aa8e-07d3230f6570", "0X-1600": "75cdb077-475d-4ff2-b642-065dbb3762aa", "-3600X2800": "dd21b622-d55f-4d86-ad1f-7bf972ae9cfd", "400X2400": "de8d962a-831b-439c-afbb-c83203284f5f", "-2400X-1200": "9e7d97d8-8414-401f-b0d0-41675e18636a", "2000X-400": "b8f7b544-5f3b-4dd7-8df4-d163b06c2338", "400X-1600": "1c5c95e3-603f-4f7b-89c1-58bfedf7468a", "800X-1600": "322372ad-9280-4038-83b3-c326cd70adb9", "-1600X4000": "d5340ea3-61c3-4e69-b3f9-ec1bbe33ebb6", "-2800X-400": "7618590a-5134-40af-8a79-1d383fbfab17", "0X0": "c1773b7a-8224-4bc9-b789-0303a8f0695d", "-2800X-3600": "808a3751-ca13-4a28-9097-9833c852a923", "0X1200": "274230d0-331b-4a4d-bb76-b0e3ed712423", "-800X0": "b3662668-6419-40b6-a75e-5001fdb2620a", "-3600X-800": "622eb803-19eb-4739-ac83-a2cf73df3bd6", "-800X800": "d8f3f1cd-51bd-4198-99a2-220ba9650ff8", "-1200X400": "e967c6c7-47ff-4527-bde5-d3707fa37fde", "-2800X2400": "9369b8dc-c33e-47fd-a46f-51e2b59a7729", "-3600X3600": "d258dc4e-b85a-48f7-8f9a-447d6e2e88ea", "-2800X-2800": "ad137113-784f-440d-96a9-56ebb83a0080", "-2400X4000": "8168ec47-134e-4bb6-9265-314a0c4be38d", "2000X-1200": "089a6a10-fad0-4ab9-831c-df92a4a3a550", "-4000X800": "2769cb5a-ae27-443c-83e4-1f2a93ec1e4b", "-3600X0": "fee3df1a-9245-4e71-81dd-286abc955c2c", "-3200X1200": "d788d8b2-cbc3-4c20-a69e-a072bc7b1c87", "-1600X1200": "ef94e784-7abb-4068-8c78-329305f8835a", "-2400X800": "7d5c10b5-5bb0-4f6d-b62a-db066ce5692f", "-1600X-400": "aedaddcd-bbb3-462b-ad51-37b79180cf56", "400X-800": "5874ba76-471d-47b8-8b0c-0732e84b0ef6", "-800X3200": "4372a41e-d078-4c63-b574-6ea75347ea9e", "-400X-1600": "b65ae5e6-68ee-4606-84be-515ba9fb03b2", "800X-800": "c68fdd94-41c1-4d16-a66b-6ecb84a5c17a", "-1600X-3200": "687154be-0d44-4179-83d0-b030bb4c079b", "2400X-1600": "9f62e2a7-783d-4c46-bd6d-c756f3cf1604", "-1200X-2400": "a6da34ec-d269-4d34-a832-3c5a4605bd09", "1600X-400": "395ee120-a412-4ad4-9e20-43e12f680a6f", "-2800X2800": "8296e244-a401-4943-8d8e-9bd651506cf8", "-2800X-1200": "8b2ecad2-1a75-4de1-8839-e663a77c7327", "-2000X-4000": "1af2be93-570e-4d49-8419-007897cce660", "-2800X-1600": "1dd0713b-e5e9-420a-b4e7-d9936aa1a740", "-1200X4000": "6e57d80f-120d-46b5-8b8e-48963af7ad36", "1600X-2000": "68bc49bb-38c1-4972-a44b-7266ea13a555", "-4000X-3200": "710f0c30-6671-4e4e-9b71-b4f327085647", "400X1600": "97a2cb7e-d921-40dd-83e9-6d6c7258cce8", "-400X400": "ae58c651-cc8f-4740-96f4-4d0c62478169", "1200X-1200": "6edf7843-0519-41ac-8855-60f647d9427c", "-4000X-1600": "0b851f4f-7416-4f15-af7e-09b9721d1993", "-4000X2400": "b73fb9b7-078c-4c48-82b9-fd58c649205d", "-800X-3600": "30cdd850-0423-43da-a40d-f0c43986feb7", "-3600X2000": "7fa73c31-6b04-4c8e-825f-98d46d62c8be", "-2800X800": "687146c2-2a19-4bc2-a623-d7ce81de1980", "800X-2000": "174d2744-3faf-47c0-8c39-5c56cd86ec9e", "-3600X-400": "20f74189-1e6b-444f-b35a-55fbadd5669d", "-400X2800": "c79860b4-8a9c-48a5-8069-3a3400030373", "-2000X1600": "fe4f5cdb-d1c4-495b-9743-288aef8ae7d7", "-2000X3600": "d8f203c9-0193-47c4-9ef2-92ae2acb3ca1", "-1200X1200": "27fb5f79-31cf-4aeb-bae1-7d34b19a3c1e", "-3200X-400": "057facdf-7223-4e83-9b6f-17c2ee444e32", "-1600X2400": "dd29b4e3-0031-43ea-a918-aef1c5c19436", "400X-2000": "53f41f6f-4a48-4cf7-bbe9-4fb3b0deed9d", "0X4000": "88ee087c-e194-44b7-a59d-cfe61a9b8cf7", "-3600X-3200": "8b466df1-d9c9-4947-990a-8a294474c23a", "-4000X2000": "11035083-8bf0-4866-8a71-eb1d454ed9d5", "-1200X-3200": "d4b374c9-e474-4bae-bc8d-6e98e5214ca2", "-2800X-3200": "e27edcda-a436-4ac2-9c6c-0578955d4703", "-3200X-2400": "64693907-4178-4d55-b61b-02b62dd0e263", "2400X-400": "b2a3bb80-48dc-4ad6-9814-cb3ba8a3239f", "-2800X1600": "f5078b51-d290-460a-80a4-a9f96818ef59", "-400X-400": "a44a53a5-4899-49a6-aaa6-67d066fb1399", "-2800X3200": "dff37a75-51e4-4835-8942-460b4ba3cb19", "-2000X-400": "28aeba43-8a66-4797-b932-e8f40f762582", "-4000X-4000": "c40107c1-0252-42f7-bfcf-8ccfd450e0ec", "-3600X-1200": "187f8af5-91e6-437e-b340-7b181c0ebe30", "-3600X-3600": "b8977535-00f2-4370-a1cd-1cfc4e57e079", "0X400": "d6f3de9a-7d98-4b87-b1c2-34e9ed58208e", "-400X0": "9eb2c18a-6fdb-46e1-9e8d-d7902f5ca21d", "-3200X-1600": "1f8d4363-6575-4577-88f9-dc6cc46a7079", "-1600X3200": "0259bc87-6632-463d-a9f6-600e47a12a96", "-800X-2000": "2b8a358d-b2f6-471f-9dc6-b6f62865395c", "1600X400": "decc55af-aa98-43b3-8e3e-be5e53be3918", "-800X4000": "41106f65-85ed-4eb4-855e-394eb5d542ac", "-800X-3200": "0caf9aba-e944-4aca-ae2d-7056b96f20dc", "-2400X1200": "db96abfc-561c-4e02-9c7c-78047c1d7fd9", "-400X1600": "69f91151-ee63-4b56-83c5-936b8235b9c2", "-4000X1200": "f557be1e-1034-4238-a985-17e2b7e4b46a", "800X-2400": "b04c55a0-6aee-4d92-a22c-27335632d292", "-2000X-1600": "0b155bd6-8806-40b5-9250-6dd634229d86", "800X-3600": "bc6c68e4-964e-4e1a-b559-de5ea7a5ae21", "-4000X400": "6a8f463c-eef5-4aac-9d0a-bb86d1c18f46", "800X-4000": "db45b929-ca59-4294-aeb3-94643294ffbf", "-400X4000": "0915faa9-3f59-427c-9288-42aae7314552", "2400X-1200": "a2acd491-6ad2-4037-afb6-7221f4e8a445", "-800X-2400": "c4666007-a8ce-42e6-be45-7313e35c5f78", "-3200X2000": "1542fdef-3251-40eb-b795-8760d73b5dd1", "-400X3200": "c0e48343-b1d2-4552-a372-c45da9fb1699", "-2400X-3200": "6eb485c2-98c6-4f4a-8738-c1d39413a8ac", "400X-2400": "230c67dc-768f-4466-8e40-1815eac04844", "400X4000": "f5a8e557-cbb4-4b36-8dea-744fa75252a8", "400X-4000": "fb9afc18-1616-456b-a8be-83bd9a2b5115", "-2800X400": "d0af4bce-f33f-416a-8f87-4ccdddf0eef5", "0X1600": "6628e875-4e18-49ad-999d-9d34e2634ff2", "0X-2400": "1db6dceb-28ff-471e-9d93-3984324a6ead", "0X-2800": "0f15132a-097f-4380-a2b7-38ec2c3ea74f", "0X-3200": "47774bde-4bcd-41f0-88e1-5fb0682b1d36", "0X-3600": "c6a4ed7c-d568-42c7-b42b-23fb0938fdba", "-400X-2400": "34c69fe6-cefc-4f85-b58b-3c244f38281e", "400X-3600": "96b22a8c-2dc5-462d-8835-9926c505d0c1", "-400X3600": "499e0a5d-ea76-47bc-8c19-463a6cd0e5ed", "-800X2800": "c2e0d504-194a-42ac-98a5-60e578e4444a", "-3200X-3200": "2cad9796-6a8c-41de-8847-d493041a3d3b", "-4000X1600": "5ab162d0-ef86-4f3d-8c72-2e28696250ac", "-1600X-3600": "388cc5fd-624e-4e02-8153-c7b3f0bdc071", "-2000X2000": "2d3f1416-d557-4428-a19a-2ce574f2d477", "-400X2000": "35d6800b-fc1f-4e7d-bc06-5ddddee73126", "-400X1200": "e8bbd9eb-aaa7-40e0-ba34-0250b3ecab94", "-3600X800": "b413aa5d-d839-4569-aeb5-ce577936c8eb", "-1600X-2000": "37b7bf26-1ade-4785-9a97-3ab815af3454", "1200X0": "b0111a05-f5d6-4f80-aa80-18ae4e6355a2", "2000X-1600": "d5339390-c739-4b86-b159-52bf842b69db", "-3200X3600": "578d8977-6690-45c2-b1f3-219d72114061", "0X-4000": "af2441c8-45fc-4b8a-a9ca-b3007e7fd941", "-3600X2400": "b2579e13-8c34-4e5d-92d8-7126f914cbf9", "-400X-2800": "2d0c0e6b-db18-4aec-b8f9-aa32412d9ff4", "0X3200": "6ed1a399-ab46-40f7-a54d-6a7e8e64d7a5", "-400X-4000": "218ec98a-8284-41e2-a0fb-b48f83593a39", "-2000X1200": "57e17a27-3439-487d-b3e4-59b03d707f94", "-2400X-3600": "67e0088a-50a2-42a4-9717-6bcbd09d3629", "-1200X2400": "fd2f7d7d-9c08-44f4-90d9-19bb72f236bc", "-2800X2000": "7a7a9e2e-bfea-4357-86fd-39ce3656abd3", "-3200X-800": "aa349fca-042b-45f4-8f78-e6470a53c9dd", "1200X-800": "38348cf4-3ba8-42f0-90f0-c12fb51fd1ca", "-1200X-4000": "ee9a36d0-f1ef-4691-8227-8879c2472a7b", "-400X2400": "593ff1ca-0fae-4b6f-8da3-9a1b2472c039", "-800X1600": "8764c73f-c958-474c-b0d6-4f0ebe4763c1", "-2800X0": "d150ecc3-b9e2-4472-afba-ba7d3790bac0", "-800X-4000": "a567b5aa-bd78-49ae-ade1-a6bdc4011e8a", "-3600X1600": "cc6d558f-b4de-4c36-9db9-aef08646ee3e", "-1600X-1200": "fba49a4c-b410-4f4c-8c84-8383c0a15880", "-1200X3600": "2546dbfb-caa9-4bb4-9044-d0c946e5f575", "-1200X3200": "587b8c48-e60e-46ed-b572-6d20388c41ae", "-1600X-4000": "76ded646-6e7f-4fd7-97ac-65c4fda48418", "-800X400": "a51d4365-8c2d-4383-9270-752c79b63a62", "-2800X1200": "17622703-ca39-4d44-8eca-6c9b4a38d05d", "-1600X0": "75f3ceb9-7da6-40f7-a61c-e093c23bec8b", "-3600X-4000": "125d2c99-e232-4b7c-8d1a-351bd923536d", "-800X3600": "2b8231d9-337f-49a3-b436-de90e746fa89", "-2000X4000": "8fffbd86-ab52-4d64-a1d0-81afcb5f9857", "400X0": "0c61c63e-a041-4fe6-a758-18a0a58db47c", "2000X0": "8fa1cd84-0dcb-47cf-8271-4d532924cc79", "-400X-3600": "63abb8c1-5081-493d-a3fb-37517f5604d5", "-2000X400": "9d475f0d-6cf1-40da-8964-7c4487f31549", "-1200X0": "50f41756-b5e9-4d3b-916f-21d845ec9204", "1600X-1200": "8ea48701-9fb7-4071-a85c-19ed75bcbf00", "-1600X1600": "19ed8ec7-69b2-4590-bcf2-7f3a13a94d45", "-1600X400": "4f326b50-cecd-4b41-b816-389588e32432", "-800X-800": "d584b7a8-f15a-4088-aeba-2de356c5464c", "-2000X0": "41c5fc2c-d791-41ea-9adb-8f95cd147470", "-1200X2800": "95bd534b-1c79-472e-bbb4-8a814176fdde", "-1200X2000": "ad5e0f61-4314-4468-8454-81eb1354f82f", "-1200X-2800": "2d0ab914-4b34-48e7-9cc9-6d490a5b9e6e", "-1200X-3600": "0b039d23-7d35-4ee4-81b1-64bac2c5a66f", "-800X2000": "4582eea7-e819-489f-88d6-a86da65dfc3a", "-400X-2000": "336cf5a9-8ef1-4736-af69-8f098ea400a2", "-2800X3600": "dbf0d550-baf1-4e34-9ab0-1fe8620cd827", "-4000X-2400": "fed3e596-872f-4e31-8582-2704b0914208", "-1600X3600": "acc25972-0803-4885-b31d-b0594e0029dd", "-3600X1200": "3cad90fe-a48f-4776-84b3-09d0a0bfcba4", "800X0": "f1c73560-f3a2-4127-abbc-2fae5557ea25", "-1600X2800": "c49cf744-5152-4074-be6d-0ed884c225aa", "-1600X2000": "539f85f4-9684-45f1-9593-908940690476", "-4000X3200": "2a6f7aca-1f4b-4666-aec1-e734c6819af9", "2400X-800": "41e2df3b-a21b-4ea6-92f1-ccda380b109b", "-1600X800": "a8ba94a0-b011-4cbf-9f8a-11ae9c67b793", "-3600X-2400": "d0c60d0b-e0b9-4db8-a14e-0d3cfd165bc5", "-4000X2800": "814ff572-4198-4fb2-8cff-edab47af7d95", "-2400X-400": "c76bd4d6-a830-4e42-a4d4-ffff2d64b93a", "-4000X-1200": "eb0c5664-a6e8-4c2e-9fb7-ba3331a6ca2d", "2400X0": "53fa34ee-26d3-4b14-8990-ce824fc72081", "-3600X-2000": "7a6dbc96-0716-4564-9f3e-c58a5fef541a", "-1200X-1200": "69942c35-e9c2-488f-8903-55ec07f1cc2a", "-2000X3200": "6dcdc9d5-88aa-4a10-a891-4f679cdb9cae", "-2000X2400": "ccb31491-ffe4-4298-9f13-caa28b86c145", "-2000X800": "0c1bc0af-6069-4d9f-affe-99c0035b7f94", "-2400X-800": "1c48caf1-8aea-456c-a2bd-610f219ee030", "-2000X-2400": "d7b5adba-9c5d-43b1-8a41-5bbc93620de9", "-2400X-4000": "efb18d8f-2e83-49b3-be43-75719e51ef83", "-2400X3600": "6ea9571a-7450-432e-b94e-6ebb3dc23ce6", "-2400X2000": "abd12209-f5e5-47fe-b86e-18ace9313928", "-2400X400": "82dd3268-64d6-4bb7-a19a-70262c3d74c9", "-2400X0": "e5a4f215-6ae6-43e5-98da-1161ed257a85", "-2000X-3200": "1cd9916f-d47a-4f5d-af56-41a2ba37cbc1", "-3200X4000": "ca0899e7-f2ae-4616-96ce-50e84005d8f9", "-3600X3200": "00cdea65-70a0-4fd0-9f34-ef179cf28f01", "400X3200": "6738dff6-2100-4dd9-976b-7c39a7758a20", "-400X-1200": "b26b3a65-5a72-45c2-bf1b-3b4266468981", "-1200X-800": "07b335db-52b9-4840-a924-cbdebc817fb1", "2000X800": "9fea62be-3065-4569-8c1a-3c910cf3d070", "400X-1200": "dfc7a1f1-bda4-43dd-bb1e-2330902c3439", "800X-400": "70f46575-e5c0-4fc7-a9b7-703e247f7aac", "-1600X-1600": "d0b3cfbd-e19e-45fc-86d7-3058448936eb", "-4000X0": "f152fd63-4ab6-45fc-97ef-0afa3f5725ac", "-3200X400": "0c589f03-bafe-4eae-af1b-3b8f21968c67", "-3200X-1200": "bf81e77a-a790-40d8-9cf0-66a78ce966cb", "-4000X4000": "0f885355-c927-48ed-8eed-42adad13e0e4", "1200X-1600": "593a277d-91be-47b3-b7d1-e7b27d0f5898" } } ]
--------------------------------------------------------------------------------
/textures/grass.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/NanoBob/ProceduralWorldGenerationClient/e57c521184251a1be8c18afecc51ce34eea5f1cf/textures/grass.png
--------------------------------------------------------------------------------
/textures/sand.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/NanoBob/ProceduralWorldGenerationClient/e57c521184251a1be8c18afecc51ce34eea5f1cf/textures/sand.png
--------------------------------------------------------------------------------
/textures/snow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/NanoBob/ProceduralWorldGenerationClient/e57c521184251a1be8c18afecc51ce34eea5f1cf/textures/snow.png
--------------------------------------------------------------------------------
/textures/stone.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/NanoBob/ProceduralWorldGenerationClient/e57c521184251a1be8c18afecc51ce34eea5f1cf/textures/stone.png
--------------------------------------------------------------------------------