diff --git a/blight-assets/src/main/resources/MatDefs/Fern.j3md b/blight-assets/src/main/resources/MatDefs/Fern.j3md new file mode 100644 index 0000000..559055c --- /dev/null +++ b/blight-assets/src/main/resources/MatDefs/Fern.j3md @@ -0,0 +1,79 @@ +MaterialDef Fern { + + MaterialParameters { + Color Diffuse (Color) : 0.18 0.60 0.10 1.0 + Float WindStrength : 0.15 + Float WindSpeed : 0.6 + Texture2D DiffuseMap + Boolean HasDiffuseMap : false + Texture2D NormalMap -LINEAR + Boolean HasNormalMap : false + + Int BoundDrawBuffer + Int FilterMode + Boolean HardwareShadows + Texture2D ShadowMap0 + Texture2D ShadowMap1 + Texture2D ShadowMap2 + Texture2D ShadowMap3 + Float ShadowIntensity : 1.0 + Vector4 Splits + Vector2 FadeInfo + Matrix4 LightViewProjectionMatrix0 + Matrix4 LightViewProjectionMatrix1 + Matrix4 LightViewProjectionMatrix2 + Matrix4 LightViewProjectionMatrix3 + Vector3 LightDir + Float PCFEdge + Float ShadowMapSize + Boolean BackfaceShadows : false + } + + Technique { + VertexShader GLSL150 : Shaders/Fern.vert + FragmentShader GLSL150 : Shaders/Fern.frag + + WorldParameters { + WorldViewProjectionMatrix + WorldMatrix + Time + } + + RenderState { + FaceCull Off + } + } + + Technique PreShadow { + VertexShader GLSL150 : Shaders/LeafPreShadow.vert + FragmentShader GLSL150 : Shaders/LeafPreShadow.frag + + WorldParameters { + WorldViewProjectionMatrix + } + + ForcedRenderState { + FaceCull Off + DepthTest On + DepthWrite On + PolyOffset 5 3 + ColorWrite Off + } + } + + Technique PostShadow { + VertexShader GLSL150 : Shaders/LeafPostShadow.vert + FragmentShader GLSL150 : Shaders/LeafPostShadow.frag + + WorldParameters { + WorldViewProjectionMatrix + WorldMatrix + } + + ForcedRenderState { + Blend Modulate + FaceCull Off + DepthWrite Off + } + } +} diff --git a/blight-assets/src/main/resources/Models/FernPlantV2.j3o.meta b/blight-assets/src/main/resources/Models/FernPlantV2.j3o.meta new file mode 100644 index 0000000..48bcf48 --- /dev/null +++ b/blight-assets/src/main/resources/Models/FernPlantV2.j3o.meta @@ -0,0 +1,15 @@ +#Mon Jun 08 11:09:04 CEST 2026 +castShadow=true +category= +name=FernPlantV2 +pivotOffsetY=0.0 +placementOffsetY=0.0 +randomScaleMax=1.0 +randomScaleMin=1.0 +receiveShadow=true +scaleX=0.002 +scaleY=0.002 +scaleZ=0.002 +solid=false +tags= +uniformScale=true diff --git a/blight-assets/src/main/resources/Models/custom_mesh_0.j3o b/blight-assets/src/main/resources/Models/custom_mesh_0.j3o index d0f4ede..d6fc94a 100644 Binary files a/blight-assets/src/main/resources/Models/custom_mesh_0.j3o and b/blight-assets/src/main/resources/Models/custom_mesh_0.j3o differ diff --git a/blight-assets/src/main/resources/Models/custom_mesh_1.j3o b/blight-assets/src/main/resources/Models/custom_mesh_1.j3o index 6cdf04f..ef03a16 100644 Binary files a/blight-assets/src/main/resources/Models/custom_mesh_1.j3o and b/blight-assets/src/main/resources/Models/custom_mesh_1.j3o differ diff --git a/blight-assets/src/main/resources/Models/custom_mesh_2.j3o b/blight-assets/src/main/resources/Models/custom_mesh_2.j3o index 7bf35ea..e3cae4a 100644 Binary files a/blight-assets/src/main/resources/Models/custom_mesh_2.j3o and b/blight-assets/src/main/resources/Models/custom_mesh_2.j3o differ diff --git a/blight-assets/src/main/resources/Models/custom_mesh_3.j3o b/blight-assets/src/main/resources/Models/custom_mesh_3.j3o index 6d2ab2a..321f38e 100644 Binary files a/blight-assets/src/main/resources/Models/custom_mesh_3.j3o and b/blight-assets/src/main/resources/Models/custom_mesh_3.j3o differ diff --git a/blight-assets/src/main/resources/Models/custom_mesh_4.j3o b/blight-assets/src/main/resources/Models/custom_mesh_4.j3o index 3a89225..130f135 100644 Binary files a/blight-assets/src/main/resources/Models/custom_mesh_4.j3o and b/blight-assets/src/main/resources/Models/custom_mesh_4.j3o differ diff --git a/blight-assets/src/main/resources/Models/custom_mesh_5.j3o b/blight-assets/src/main/resources/Models/custom_mesh_5.j3o index 60ee292..eacc7a6 100644 Binary files a/blight-assets/src/main/resources/Models/custom_mesh_5.j3o and b/blight-assets/src/main/resources/Models/custom_mesh_5.j3o differ diff --git a/blight-assets/src/main/resources/Models/custom_mesh_6.j3o b/blight-assets/src/main/resources/Models/custom_mesh_6.j3o index 39ad8d9..5458389 100644 Binary files a/blight-assets/src/main/resources/Models/custom_mesh_6.j3o and b/blight-assets/src/main/resources/Models/custom_mesh_6.j3o differ diff --git a/blight-assets/src/main/resources/Models/plants/fern/fern_20260608_165628.j3o b/blight-assets/src/main/resources/Models/plants/fern/fern_20260608_165628.j3o new file mode 100644 index 0000000..28066c2 Binary files /dev/null and b/blight-assets/src/main/resources/Models/plants/fern/fern_20260608_165628.j3o differ diff --git a/blight-assets/src/main/resources/Models/plants/fern/fern_20260608_165631.j3o b/blight-assets/src/main/resources/Models/plants/fern/fern_20260608_165631.j3o new file mode 100644 index 0000000..e89d38f Binary files /dev/null and b/blight-assets/src/main/resources/Models/plants/fern/fern_20260608_165631.j3o differ diff --git a/blight-assets/src/main/resources/Models/plants/misc/heliconia+plant+3d+model.j3o b/blight-assets/src/main/resources/Models/plants/misc/heliconia+plant+3d+model.j3o new file mode 100644 index 0000000..07c8a61 Binary files /dev/null and b/blight-assets/src/main/resources/Models/plants/misc/heliconia+plant+3d+model.j3o differ diff --git a/blight-assets/src/main/resources/Models/plants/misc/kaktusfeige.j3o b/blight-assets/src/main/resources/Models/plants/misc/kaktusfeige.j3o new file mode 100644 index 0000000..7be507c Binary files /dev/null and b/blight-assets/src/main/resources/Models/plants/misc/kaktusfeige.j3o differ diff --git a/blight-assets/src/main/resources/Models/plants/misc/kaktusfeige.j3o.meta b/blight-assets/src/main/resources/Models/plants/misc/kaktusfeige.j3o.meta new file mode 100644 index 0000000..882c668 --- /dev/null +++ b/blight-assets/src/main/resources/Models/plants/misc/kaktusfeige.j3o.meta @@ -0,0 +1,20 @@ +#Mon Jun 08 22:18:33 CEST 2026 +castShadow=true +category= +cullDistance=120.0 +lod1Distance=30.0 +lod1Path= +lod2Distance=80.0 +lod2Path= +name=kaktusfeige +pivotOffsetY=0.0 +placementOffsetY=0.0 +randomScaleMax=1.0 +randomScaleMin=1.0 +receiveShadow=true +scaleX=2.5 +scaleY=2.5 +scaleZ=2.5 +solid=true +tags= +uniformScale=true diff --git a/blight-assets/src/main/resources/Models/plants/usable/blutagave.j3o b/blight-assets/src/main/resources/Models/plants/usable/blutagave.j3o new file mode 100644 index 0000000..11d1c95 Binary files /dev/null and b/blight-assets/src/main/resources/Models/plants/usable/blutagave.j3o differ diff --git a/blight-assets/src/main/resources/Models/plants/usable/erzmoss.j3o b/blight-assets/src/main/resources/Models/plants/usable/erzmoss.j3o new file mode 100644 index 0000000..49894dc Binary files /dev/null and b/blight-assets/src/main/resources/Models/plants/usable/erzmoss.j3o differ diff --git a/blight-assets/src/main/resources/Models/plants/usable/geisterfarn.j3o b/blight-assets/src/main/resources/Models/plants/usable/geisterfarn.j3o new file mode 100644 index 0000000..d6a70ba Binary files /dev/null and b/blight-assets/src/main/resources/Models/plants/usable/geisterfarn.j3o differ diff --git a/blight-assets/src/main/resources/Models/plants/usable/quelllilie.j3o b/blight-assets/src/main/resources/Models/plants/usable/quelllilie.j3o new file mode 100644 index 0000000..5a221f1 Binary files /dev/null and b/blight-assets/src/main/resources/Models/plants/usable/quelllilie.j3o differ diff --git a/blight-assets/src/main/resources/Models/plants/usable/sonnenherz.j3o b/blight-assets/src/main/resources/Models/plants/usable/sonnenherz.j3o new file mode 100644 index 0000000..389977d Binary files /dev/null and b/blight-assets/src/main/resources/Models/plants/usable/sonnenherz.j3o differ diff --git a/blight-assets/src/main/resources/Models/plants/usable/windschiff.j3o b/blight-assets/src/main/resources/Models/plants/usable/windschiff.j3o new file mode 100644 index 0000000..6c5de89 Binary files /dev/null and b/blight-assets/src/main/resources/Models/plants/usable/windschiff.j3o differ diff --git a/blight-assets/src/main/resources/Models/trees/oak/large/oak_large_20260606_163631.j3o b/blight-assets/src/main/resources/Models/trees/oak/large/oak_large_20260606_163631.j3o deleted file mode 100644 index df717c3..0000000 Binary files a/blight-assets/src/main/resources/Models/trees/oak/large/oak_large_20260606_163631.j3o and /dev/null differ diff --git a/blight-assets/src/main/resources/Models/trees/oak/large/oak_large_20260606_163636.j3o b/blight-assets/src/main/resources/Models/trees/oak/large/oak_large_20260606_163636.j3o deleted file mode 100644 index 6190289..0000000 Binary files a/blight-assets/src/main/resources/Models/trees/oak/large/oak_large_20260606_163636.j3o and /dev/null differ diff --git a/blight-assets/src/main/resources/Models/trees/oak/large/oak_large_20260606_163819.j3o b/blight-assets/src/main/resources/Models/trees/oak/large/oak_large_20260606_163819.j3o deleted file mode 100644 index cd090fa..0000000 Binary files a/blight-assets/src/main/resources/Models/trees/oak/large/oak_large_20260606_163819.j3o and /dev/null differ diff --git a/blight-assets/src/main/resources/Models/trees/oak/medium/oak_medium_20260606_162818.j3o b/blight-assets/src/main/resources/Models/trees/oak/medium/oak_medium_20260606_162818.j3o deleted file mode 100644 index 6403e19..0000000 Binary files a/blight-assets/src/main/resources/Models/trees/oak/medium/oak_medium_20260606_162818.j3o and /dev/null differ diff --git a/blight-assets/src/main/resources/Models/trees/oak/medium/oak_medium_20260606_163554.j3o b/blight-assets/src/main/resources/Models/trees/oak/medium/oak_medium_20260606_163554.j3o deleted file mode 100644 index 34c57f0..0000000 Binary files a/blight-assets/src/main/resources/Models/trees/oak/medium/oak_medium_20260606_163554.j3o and /dev/null differ diff --git a/blight-assets/src/main/resources/Models/trees/oak/medium/oak_medium_20260606_190655.j3o b/blight-assets/src/main/resources/Models/trees/oak/medium/oak_medium_20260606_190655.j3o deleted file mode 100644 index 0a12c7d..0000000 Binary files a/blight-assets/src/main/resources/Models/trees/oak/medium/oak_medium_20260606_190655.j3o and /dev/null differ diff --git a/blight-assets/src/main/resources/Models/trees/oak/medium/oak_medium_20260607_221049.j3o b/blight-assets/src/main/resources/Models/trees/oak/medium/oak_medium_20260607_221049.j3o deleted file mode 100644 index 469f13b..0000000 Binary files a/blight-assets/src/main/resources/Models/trees/oak/medium/oak_medium_20260607_221049.j3o and /dev/null differ diff --git a/blight-assets/src/main/resources/Models/trees/oak/medium/oak_medium_20260608_200434.j3o b/blight-assets/src/main/resources/Models/trees/oak/medium/oak_medium_20260608_200434.j3o new file mode 100644 index 0000000..e7bc320 Binary files /dev/null and b/blight-assets/src/main/resources/Models/trees/oak/medium/oak_medium_20260608_200434.j3o differ diff --git a/blight-assets/src/main/resources/Models/trees/pine/large/pine_large_20260606_190805.j3o b/blight-assets/src/main/resources/Models/trees/pine/large/pine_large_20260606_190805.j3o deleted file mode 100644 index 1cb0271..0000000 Binary files a/blight-assets/src/main/resources/Models/trees/pine/large/pine_large_20260606_190805.j3o and /dev/null differ diff --git a/blight-assets/src/main/resources/Shaders/Fern.frag b/blight-assets/src/main/resources/Shaders/Fern.frag new file mode 100644 index 0000000..3893463 --- /dev/null +++ b/blight-assets/src/main/resources/Shaders/Fern.frag @@ -0,0 +1,42 @@ +#import "Common/ShaderLib/GLSLCompat.glsllib" + +uniform vec4 m_Diffuse; +uniform sampler2D m_DiffuseMap; +uniform bool m_HasDiffuseMap; +uniform sampler2D m_NormalMap; +uniform bool m_HasNormalMap; + +in vec2 texCoord; +in vec3 vNormal; +in vec3 vTangent; +in float vHandedness; + +void main() { + vec3 baseColor; + if (m_HasDiffuseMap) { + vec4 tex = texture2D(m_DiffuseMap, texCoord); + if (tex.a < 0.5) discard; + baseColor = tex.rgb * m_Diffuse.rgb; + } else { + vec2 uv = texCoord * 2.0 - 1.0; + if (dot(uv, uv) > 0.95) discard; + baseColor = m_Diffuse.rgb; + } + + vec3 N = normalize(vNormal); + if (m_HasNormalMap) { + vec3 T = normalize(vTangent); + vec3 B = normalize(cross(N, T) * vHandedness); + mat3 TBN = mat3(T, B, N); + vec3 nm = texture2D(m_NormalMap, texCoord).rgb * 2.0 - 1.0; + N = normalize(TBN * nm); + } + + vec3 sun = normalize(vec3(0.4, 1.0, 0.3)); + float diff = max(0.0, dot(N, sun)); + // two-sided: underside receives half brightness + diff = max(diff, max(0.0, dot(-N, sun)) * 0.5); + float lit = 0.45 + diff * 0.55; + + gl_FragColor = vec4(baseColor * lit, 1.0); +} diff --git a/blight-assets/src/main/resources/Shaders/Fern.vert b/blight-assets/src/main/resources/Shaders/Fern.vert new file mode 100644 index 0000000..5f607ee --- /dev/null +++ b/blight-assets/src/main/resources/Shaders/Fern.vert @@ -0,0 +1,34 @@ +#import "Common/ShaderLib/GLSLCompat.glsllib" + +uniform mat4 g_WorldViewProjectionMatrix; +uniform mat4 g_WorldMatrix; +uniform float g_Time; +uniform float m_WindStrength; +uniform float m_WindSpeed; + +in vec3 inPosition; +in vec3 inNormal; +in vec2 inTexCoord; +in vec4 inColor; // R = wind weight (0=base, 1=tip) +in vec4 inTangent; // xyz=tangent, w=handedness + +out vec2 texCoord; +out vec3 vNormal; +out vec3 vTangent; +out float vHandedness; + +void main() { + float windW = inColor.r; + float t = g_Time * m_WindSpeed; + vec4 wp = g_WorldMatrix * vec4(inPosition, 1.0); + float phase = wp.x * 0.08 + wp.z * 0.06; + float swayX = sin(t + phase) * windW * m_WindStrength; + float swayZ = cos(t*0.73 + phase) * windW * m_WindStrength * 0.55; + vec3 anim = inPosition + vec3(swayX, 0.0, swayZ); + + gl_Position = g_WorldViewProjectionMatrix * vec4(anim, 1.0); + texCoord = inTexCoord; + vNormal = normalize((g_WorldMatrix * vec4(inNormal, 0.0)).xyz); + vTangent = normalize((g_WorldMatrix * vec4(inTangent.xyz, 0.0)).xyz); + vHandedness = inTangent.w; +} diff --git a/blight-assets/src/main/resources/Textures/fern/Fern02_Diffuse.tga b/blight-assets/src/main/resources/Textures/fern/Fern02_Diffuse.tga new file mode 100644 index 0000000..f54f5e0 Binary files /dev/null and b/blight-assets/src/main/resources/Textures/fern/Fern02_Diffuse.tga differ diff --git a/blight-assets/src/main/resources/Textures/fern/Fern02_Normal.tga b/blight-assets/src/main/resources/Textures/fern/Fern02_Normal.tga new file mode 100644 index 0000000..6fd6e0b Binary files /dev/null and b/blight-assets/src/main/resources/Textures/fern/Fern02_Normal.tga differ diff --git a/blight-assets/src/main/resources/Textures/fern/Fern02_Specular.tga b/blight-assets/src/main/resources/Textures/fern/Fern02_Specular.tga new file mode 100644 index 0000000..d440482 Binary files /dev/null and b/blight-assets/src/main/resources/Textures/fern/Fern02_Specular.tga differ diff --git a/blight-assets/src/main/resources/Textures/impostor/ez_impostor_ash_large_20260608_160327.png b/blight-assets/src/main/resources/Textures/impostor/ez_impostor_ash_large_20260608_160327.png new file mode 100644 index 0000000..cd55ac3 Binary files /dev/null and b/blight-assets/src/main/resources/Textures/impostor/ez_impostor_ash_large_20260608_160327.png differ diff --git a/blight-assets/src/main/resources/Textures/impostor/ez_impostor_aspen_large_20260608_185100.png b/blight-assets/src/main/resources/Textures/impostor/ez_impostor_aspen_large_20260608_185100.png new file mode 100644 index 0000000..30cc8cd Binary files /dev/null and b/blight-assets/src/main/resources/Textures/impostor/ez_impostor_aspen_large_20260608_185100.png differ diff --git a/blight-assets/src/main/resources/Textures/impostor/ez_impostor_oak_medium_20260608_190845.png b/blight-assets/src/main/resources/Textures/impostor/ez_impostor_oak_medium_20260608_190845.png new file mode 100644 index 0000000..60bd14a Binary files /dev/null and b/blight-assets/src/main/resources/Textures/impostor/ez_impostor_oak_medium_20260608_190845.png differ diff --git a/blight-assets/src/main/resources/Textures/impostor/ez_impostor_oak_medium_20260608_191554.png b/blight-assets/src/main/resources/Textures/impostor/ez_impostor_oak_medium_20260608_191554.png new file mode 100644 index 0000000..14a53e8 Binary files /dev/null and b/blight-assets/src/main/resources/Textures/impostor/ez_impostor_oak_medium_20260608_191554.png differ diff --git a/blight-assets/src/main/resources/Textures/impostor/ez_impostor_oak_medium_20260608_200434.png b/blight-assets/src/main/resources/Textures/impostor/ez_impostor_oak_medium_20260608_200434.png new file mode 100644 index 0000000..3c7717e Binary files /dev/null and b/blight-assets/src/main/resources/Textures/impostor/ez_impostor_oak_medium_20260608_200434.png differ diff --git a/blight-assets/src/main/resources/Textures/impostor/impostor_oak_20260608_155226.png b/blight-assets/src/main/resources/Textures/impostor/impostor_oak_20260608_155226.png new file mode 100644 index 0000000..e2f23af Binary files /dev/null and b/blight-assets/src/main/resources/Textures/impostor/impostor_oak_20260608_155226.png differ diff --git a/blight-assets/src/main/resources/Textures/impostor/impostor_pine_20260608_143905.png b/blight-assets/src/main/resources/Textures/impostor/impostor_pine_20260608_143905.png new file mode 100644 index 0000000..bc038d7 Binary files /dev/null and b/blight-assets/src/main/resources/Textures/impostor/impostor_pine_20260608_143905.png differ diff --git a/blight-assets/src/main/resources/Textures/impostor/impostor_pine_20260608_152427.png b/blight-assets/src/main/resources/Textures/impostor/impostor_pine_20260608_152427.png new file mode 100644 index 0000000..b6d724f Binary files /dev/null and b/blight-assets/src/main/resources/Textures/impostor/impostor_pine_20260608_152427.png differ diff --git a/blight-assets/src/main/resources/Textures/impostor/impostor_pine_20260608_160151.png b/blight-assets/src/main/resources/Textures/impostor/impostor_pine_20260608_160151.png new file mode 100644 index 0000000..a1161a2 Binary files /dev/null and b/blight-assets/src/main/resources/Textures/impostor/impostor_pine_20260608_160151.png differ diff --git a/blight-assets/src/main/resources/Textures/impostor/impostor_willow_20260608_152437.png b/blight-assets/src/main/resources/Textures/impostor/impostor_willow_20260608_152437.png new file mode 100644 index 0000000..fc6d9b8 Binary files /dev/null and b/blight-assets/src/main/resources/Textures/impostor/impostor_willow_20260608_152437.png differ diff --git a/blight-assets/src/main/resources/Textures/impostor/impostor_willow_20260608_152445.png b/blight-assets/src/main/resources/Textures/impostor/impostor_willow_20260608_152445.png new file mode 100644 index 0000000..af31637 Binary files /dev/null and b/blight-assets/src/main/resources/Textures/impostor/impostor_willow_20260608_152445.png differ diff --git a/blight-assets/src/main/resources/animations/pickup.glb b/blight-assets/src/main/resources/animations/pickup.glb new file mode 100644 index 0000000..a8f4b47 Binary files /dev/null and b/blight-assets/src/main/resources/animations/pickup.glb differ diff --git a/blight-assets/src/main/resources/items/neues_item_1780949443027.item b/blight-assets/src/main/resources/items/neues_item_1780949443027.item new file mode 100644 index 0000000..1ed9243 --- /dev/null +++ b/blight-assets/src/main/resources/items/neues_item_1780949443027.item @@ -0,0 +1,11 @@ +{ + "itemId": "neues_item_1780949443027", + "category": "CONSUMABLES", + "name": { + "id": "bloddagave.name" + }, + "description": { + "id": "bloddagave.description" + }, + "worthGold": 50 +} \ No newline at end of file diff --git a/blight-common/src/main/java/de/blight/common/ChunkTerrainIO.java b/blight-common/src/main/java/de/blight/common/ChunkTerrainIO.java new file mode 100644 index 0000000..184c030 --- /dev/null +++ b/blight-common/src/main/java/de/blight/common/ChunkTerrainIO.java @@ -0,0 +1,254 @@ +package de.blight.common; + +import java.io.*; +import java.nio.file.*; +import java.util.zip.*; + +/** + * Konstanten, Datei-I/O und Hilfsmethoden für das chunk-basierte Terrain-System. + * + * Die Welt (4096 × 4096 m) wird in CHUNKS_PER_AXIS² = 32² = 1024 quadratische + * Chunks à CHUNK_SIZE = 128 m unterteilt. Jeder Chunk speichert CHUNK_VERTS² = 129² + * Höhenwerte bei 1 m Auflösung (native Editor-Auflösung). + * + * LOD-Stufen (3): + * LOD 0 – 1 m/Vertex (129×129) – nah, Chebyshev-Dist ≤ LOD0_RANGE + * LOD 1 – 4 m/Vertex (33×33) – mittel, Chebyshev-Dist ≤ LOD1_RANGE + * LOD 2 – 16 m/Vertex (9×9) – fern, Rest + * + * Kanten-IDs (EDGE_*): werden für Seam-Stitching verwendet. + */ +public final class ChunkTerrainIO { + + // ── Welt / Chunk-Konfiguration ───────────────────────────────────────────── + public static final int CHUNK_SIZE = 128; + public static final int WORLD_SIZE = 4096; + public static final int CHUNKS_PER_AXIS = WORLD_SIZE / CHUNK_SIZE; // 32 + public static final int CHUNK_COUNT = CHUNKS_PER_AXIS * CHUNKS_PER_AXIS; // 1024 + /** Vertices pro Kante bei nativer 1-m-Auflösung (inklusiv). */ + public static final int CHUNK_VERTS = CHUNK_SIZE + 1; // 129 + + // ── LOD-Konfiguration ────────────────────────────────────────────────────── + public static final int LOD_COUNT = 3; + /** Meter pro Vertex je LOD-Stufe. */ + public static final float[] LOD_SPACING = { 1f, 4f, 16f }; + /** Vertices pro Kante je LOD-Stufe. */ + public static final int[] LOD_VERTS = { 129, 33, 9 }; + /** Chebyshev-Distanz (in Chunks) bis inkl. dieser Stufe aktiv ist. */ + public static final int LOD0_RANGE = 1; + public static final int LOD1_RANGE = 3; + /** Chebyshev-Distanz ≤ PHYSICS_RANGE: Physik-Collider aktiv. */ + public static final int PHYSICS_RANGE = 1; + + // ── Kanten-Konstanten ────────────────────────────────────────────────────── + public static final int EDGE_NORTH = 0; // höchste Zeile (row = VERTS-1) + public static final int EDGE_SOUTH = 1; // unterste Zeile (row = 0) + public static final int EDGE_EAST = 2; // rechteste Spalte (col = VERTS-1) + public static final int EDGE_WEST = 3; // linkeste Spalte (col = 0) + + private static final int MAGIC = 0x424C4354; // "BLCT" + private static final int VERSION = 1; + + private ChunkTerrainIO() {} + + // ── Dateipfade ───────────────────────────────────────────────────────────── + + public static Path chunksDir() { + return MapIO.getMapPath().resolveSibling("chunks"); + } + + public static Path getChunkPath(int cx, int cz) { + return chunksDir().resolve(String.format("chunk_%02d_%02d.blc", cx, cz)); + } + + public static boolean chunkExists(int cx, int cz) { + return Files.exists(getChunkPath(cx, cz)); + } + + public static boolean allChunksExist() { + for (int cz = 0; cz < CHUNKS_PER_AXIS; cz++) + for (int cx = 0; cx < CHUNKS_PER_AXIS; cx++) + if (!chunkExists(cx, cz)) return false; + return true; + } + + // ── I/O ─────────────────────────────────────────────────────────────────── + + public static void saveChunk(int cx, int cz, float[] heights) throws IOException { + if (heights.length != CHUNK_VERTS * CHUNK_VERTS) + throw new IllegalArgumentException("heights.length muss " + (CHUNK_VERTS * CHUNK_VERTS) + " sein"); + Path p = getChunkPath(cx, cz); + Path tmp = p.resolveSibling(p.getFileName() + ".tmp"); + Files.createDirectories(p.getParent()); + try (DataOutputStream out = new DataOutputStream( + new BufferedOutputStream(new GZIPOutputStream(Files.newOutputStream(tmp))))) { + out.writeInt(MAGIC); + out.writeInt(VERSION); + out.writeInt(cx); + out.writeInt(cz); + for (float h : heights) out.writeFloat(h); + } + try { + Files.move(tmp, p, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE); + } catch (AtomicMoveNotSupportedException e) { + Files.move(tmp, p, StandardCopyOption.REPLACE_EXISTING); + } + } + + public static float[] loadChunk(int cx, int cz) throws IOException { + try (DataInputStream in = new DataInputStream( + new BufferedInputStream(new GZIPInputStream( + Files.newInputStream(getChunkPath(cx, cz)))))) { + if (in.readInt() != MAGIC) throw new IOException("Ungültiges Chunk-Format"); + int ver = in.readInt(); + if (ver != VERSION) throw new IOException("Unbekannte Chunk-Version: " + ver); + in.readInt(); // cx (ignoriert, Dateiname ist maßgeblich) + in.readInt(); // cz + float[] h = new float[CHUNK_VERTS * CHUNK_VERTS]; + for (int i = 0; i < h.length; i++) h[i] = in.readFloat(); + return h; + } + } + + // ── Export ──────────────────────────────────────────────────────────────── + + /** + * Teilt die Editor-Heightmap (4097 × 4097, 1 m/Vertex) in 1024 Chunk-Dateien auf. + * Direkte Kopie ohne Interpolation – jeder Chunk enthält exakt die Editor-Vertices + * seines Bereichs. + */ + public static void exportFromEditorHeightMap(float[] editorH, int editorVerts) throws IOException { + for (int cz = 0; cz < CHUNKS_PER_AXIS; cz++) { + for (int cx = 0; cx < CHUNKS_PER_AXIS; cx++) { + float[] chunk = new float[CHUNK_VERTS * CHUNK_VERTS]; + for (int row = 0; row < CHUNK_VERTS; row++) { + int srcRow = cz * CHUNK_SIZE + row; + for (int col = 0; col < CHUNK_VERTS; col++) { + chunk[row * CHUNK_VERTS + col] = editorH[srcRow * editorVerts + cx * CHUNK_SIZE + col]; + } + } + saveChunk(cx, cz, chunk); + } + } + } + + /** + * Migriert eine alte MapData (16385 × 16385 Höhenwerte, 0,25 m/Vertex) + * in das Chunk-Format. Jeder Chunk enthält 129 × 129 Werte (jeder 4. Quell-Vertex). + */ + public static void exportFromMapData(MapData data) throws IOException { + int srcVerts = MapData.TERRAIN_VERTS; // 16385 + int srcPerChunk = (srcVerts - 1) / CHUNKS_PER_AXIS; // 512 + int step = srcPerChunk / (CHUNK_VERTS - 1); // 4 + for (int cz = 0; cz < CHUNKS_PER_AXIS; cz++) { + for (int cx = 0; cx < CHUNKS_PER_AXIS; cx++) { + float[] chunk = new float[CHUNK_VERTS * CHUNK_VERTS]; + for (int row = 0; row < CHUNK_VERTS; row++) { + int srcRow = Math.min(cz * srcPerChunk + row * step, srcVerts - 1); + for (int col = 0; col < CHUNK_VERTS; col++) { + int srcCol = Math.min(cx * srcPerChunk + col * step, srcVerts - 1); + chunk[row * CHUNK_VERTS + col] = data.terrainHeight[srcRow * srcVerts + srcCol]; + } + } + saveChunk(cx, cz, chunk); + } + } + } + + /** Erzeugt leere (flache) Chunk-Dateien mit Höhe 1.0 für alle 1024 Chunks. */ + public static void exportBlankChunks() throws IOException { + float[] flat = new float[CHUNK_VERTS * CHUNK_VERTS]; + java.util.Arrays.fill(flat, 1f); + for (int cz = 0; cz < CHUNKS_PER_AXIS; cz++) + for (int cx = 0; cx < CHUNKS_PER_AXIS; cx++) + saveChunk(cx, cz, flat); + } + + // ── Downsample ──────────────────────────────────────────────────────────── + + /** Bilineare Verkleinerung eines quadratischen srcVerts²-Arrays auf dstVerts². */ + public static float[] downsample(float[] src, int srcVerts, int dstVerts) { + if (srcVerts == dstVerts) return src.clone(); + float[] dst = new float[dstVerts * dstVerts]; + float step = (float) (srcVerts - 1) / (dstVerts - 1); + for (int dz = 0; dz < dstVerts; dz++) { + float sz = dz * step; + int sz0 = Math.min((int) sz, srcVerts - 2), sz1 = sz0 + 1; + float fz = sz - sz0; + for (int dx = 0; dx < dstVerts; dx++) { + float sx = dx * step; + int sx0 = Math.min((int) sx, srcVerts - 2), sx1 = sx0 + 1; + float fx = sx - sx0; + dst[dz * dstVerts + dx] = + (src[sz0 * srcVerts + sx0] * (1 - fx) + src[sz0 * srcVerts + sx1] * fx) * (1 - fz) + + (src[sz1 * srcVerts + sx0] * (1 - fx) + src[sz1 * srcVerts + sx1] * fx) * fz; + } + } + return dst; + } + + // ── Seam-Stitching ──────────────────────────────────────────────────────── + + /** + * Extrahiert den Rand eines quadratischen height-Arrays (verts × verts). + * Werte in Leserichtung: West→Ost für NORTH/SOUTH, Nord→Süd für EAST/WEST. + */ + public static float[] extractEdge(float[] heights, int verts, int edge) { + float[] e = new float[verts]; + switch (edge) { + case EDGE_NORTH -> { for (int i = 0; i < verts; i++) e[i] = heights[(verts - 1) * verts + i]; } + case EDGE_SOUTH -> { System.arraycopy(heights, 0, e, 0, verts); } + case EDGE_EAST -> { for (int i = 0; i < verts; i++) e[i] = heights[i * verts + (verts - 1)]; } + case EDGE_WEST -> { for (int i = 0; i < verts; i++) e[i] = heights[i * verts]; } + } + return e; + } + + /** + * Passt die Randwerte in {@code heights} (fineVerts × fineVerts) an die gröbere + * Nachbar-Kante an: nicht-ausgerichtete Zwischenvertices werden auf die lineare + * Interpolation der Anker-Vertices gesetzt → eliminiert Höhenrisse an LOD-Grenzen. + * + * @param heights height-Array des feinen Chunks (in-place modifiziert) + * @param fineVerts Vertices pro Kante (fein) + * @param coarseEdge Randwerte des groben Nachbarn (Länge coarseVerts) + * @param coarseVerts Länge von coarseEdge + * @param edge welche Kante dieses Chunks (EDGE_*) + */ + public static void stitchEdge(float[] heights, int fineVerts, + float[] coarseEdge, int coarseVerts, int edge) { + int ratio = (fineVerts - 1) / (coarseVerts - 1); + for (int i = 0; i < fineVerts; i++) { + if (i % ratio == 0) continue; + int k0 = i / ratio; + float t = (float) (i % ratio) / ratio; + float snapped = coarseEdge[k0] + (coarseEdge[k0 + 1] - coarseEdge[k0]) * t; + int idx = switch (edge) { + case EDGE_NORTH -> (fineVerts - 1) * fineVerts + i; + case EDGE_SOUTH -> i; + case EDGE_EAST -> i * fineVerts + (fineVerts - 1); + default -> i * fineVerts; // EDGE_WEST + }; + heights[idx] = snapped; + } + } + + // ── LOD-Hilfsmethoden ───────────────────────────────────────────────────── + + /** Gibt den LOD-Level für eine gegebene Chebyshev-Distanz zurück. */ + public static int lodForDistance(int chebyshev) { + if (chebyshev <= LOD0_RANGE) return 0; + if (chebyshev <= LOD1_RANGE) return 1; + return 2; + } + + /** Chebyshev-Distanz (in Chunks) zwischen zwei Chunk-Koordinaten. */ + public static int chebyshev(int ax, int az, int bx, int bz) { + return Math.max(Math.abs(ax - bx), Math.abs(az - bz)); + } + + /** Flacher Chunk-Index aus Chunk-Koordinaten. */ + public static int chunkIndex(int cx, int cz) { + return cz * CHUNKS_PER_AXIS + cx; + } +} diff --git a/blight-common/src/main/java/de/blight/common/ModelMeta.java b/blight-common/src/main/java/de/blight/common/ModelMeta.java index e91bd95..e310bc5 100644 --- a/blight-common/src/main/java/de/blight/common/ModelMeta.java +++ b/blight-common/src/main/java/de/blight/common/ModelMeta.java @@ -18,11 +18,17 @@ public record ModelMeta( boolean castShadow, boolean receiveShadow, float randomScaleMin, - float randomScaleMax + float randomScaleMax, + String lod1Path, // relativer Asset-Pfad; "" = nicht gesetzt + String lod2Path, + float lod1Distance, // ab dieser Distanz LOD1 anzeigen + float lod2Distance, // ab dieser Distanz LOD2 anzeigen + float cullDistance // ab dieser Distanz ausblenden ) { public static ModelMeta defaults(String j3oFileName) { String name = j3oFileName.replaceFirst("\\.j3o$", ""); return new ModelMeta(name, "", "", 1f, 1f, 1f, true, 0f, 0f, - false, true, true, 1f, 1f); + false, true, true, 1f, 1f, + "", "", 30f, 80f, 120f); } } diff --git a/blight-common/src/main/java/de/blight/common/ModelMetaIO.java b/blight-common/src/main/java/de/blight/common/ModelMetaIO.java index 6047b44..e2549e8 100644 --- a/blight-common/src/main/java/de/blight/common/ModelMetaIO.java +++ b/blight-common/src/main/java/de/blight/common/ModelMetaIO.java @@ -29,6 +29,11 @@ public final class ModelMetaIO { p.setProperty("receiveShadow", String.valueOf(m.receiveShadow())); p.setProperty("randomScaleMin", String.valueOf(m.randomScaleMin())); p.setProperty("randomScaleMax", String.valueOf(m.randomScaleMax())); + p.setProperty("lod1Path", m.lod1Path()); + p.setProperty("lod2Path", m.lod2Path()); + p.setProperty("lod1Distance", String.valueOf(m.lod1Distance())); + p.setProperty("lod2Distance", String.valueOf(m.lod2Distance())); + p.setProperty("cullDistance", String.valueOf(m.cullDistance())); try (Writer w = Files.newBufferedWriter(metaPath(j3oPath))) { p.store(w, null); } @@ -57,7 +62,12 @@ public final class ModelMetaIO { Boolean.parseBoolean(p.getProperty("castShadow", "true")), Boolean.parseBoolean(p.getProperty("receiveShadow", "true")), parseFloat(p, "randomScaleMin", 1f), - parseFloat(p, "randomScaleMax", 1f) + parseFloat(p, "randomScaleMax", 1f), + p.getProperty("lod1Path", ""), + p.getProperty("lod2Path", ""), + parseFloat(p, "lod1Distance", 30f), + parseFloat(p, "lod2Distance", 80f), + parseFloat(p, "cullDistance", 120f) ); } diff --git a/blight-common/src/main/java/de/blight/common/PlacedItem.java b/blight-common/src/main/java/de/blight/common/PlacedItem.java new file mode 100644 index 0000000..aa50872 --- /dev/null +++ b/blight-common/src/main/java/de/blight/common/PlacedItem.java @@ -0,0 +1,4 @@ +package de.blight.common; + +/** Ein Item-Pickup das auf der Spielwelt liegt (Kartendaten). */ +public record PlacedItem(String itemId, float x, float y, float z) {} diff --git a/blight-common/src/main/java/de/blight/common/PlacedItemIO.java b/blight-common/src/main/java/de/blight/common/PlacedItemIO.java new file mode 100644 index 0000000..e3fe832 --- /dev/null +++ b/blight-common/src/main/java/de/blight/common/PlacedItemIO.java @@ -0,0 +1,51 @@ +package de.blight.common; + +import java.io.*; +import java.nio.file.*; +import java.util.*; + +/** + * Liest und schreibt auf der Karte liegende Items (Pickups). + * Datei: {@code blight_placed_items.bpi} neben {@code blight_map.blm}. + * Format: {@code itemId\tx\ty\tz} + */ +public final class PlacedItemIO { + + private PlacedItemIO() {} + + public static Path getPath() { + return MapIO.getMapPath().resolveSibling("blight_placed_items.bpi"); + } + + public static void save(List items) throws IOException { + Path p = getPath(); + Files.createDirectories(p.getParent()); + try (BufferedWriter w = Files.newBufferedWriter(p)) { + w.write("# itemId\tx\ty\tz"); + w.newLine(); + for (PlacedItem it : items) { + w.write(String.format(Locale.ROOT, "%s\t%.5f\t%.5f\t%.5f%n", + it.itemId(), it.x(), it.y(), it.z())); + } + } + } + + public static List load() throws IOException { + Path p = getPath(); + if (!Files.exists(p)) return List.of(); + List list = new ArrayList<>(); + for (String line : Files.readAllLines(p)) { + line = line.strip(); + if (line.isEmpty() || line.startsWith("#")) continue; + String[] f = line.split("\t", -1); + if (f.length < 4) continue; + try { + list.add(new PlacedItem(f[0], + Float.parseFloat(f[1]), + Float.parseFloat(f[2]), + Float.parseFloat(f[3]))); + } catch (NumberFormatException ignored) {} + } + return list; + } +} diff --git a/blight-common/src/main/java/de/blight/common/PlacedModel.java b/blight-common/src/main/java/de/blight/common/PlacedModel.java index 52a6101..01a476a 100644 --- a/blight-common/src/main/java/de/blight/common/PlacedModel.java +++ b/blight-common/src/main/java/de/blight/common/PlacedModel.java @@ -13,5 +13,10 @@ public record PlacedModel( /** AnimationLibrary-Clip-Key (z. B. "walk/Run"); "" = keine Animation. */ String animClip, boolean castShadow, - boolean receiveShadow + boolean receiveShadow, + String lod1Path, // relativer Asset-Pfad; "" = nicht gesetzt + String lod2Path, + float lod1Distance, // ab dieser Distanz LOD1 anzeigen + float lod2Distance, // ab dieser Distanz LOD2 anzeigen + float cullDistance // ab dieser Distanz ausblenden ) {} diff --git a/blight-common/src/main/java/de/blight/common/PlacedModelIO.java b/blight-common/src/main/java/de/blight/common/PlacedModelIO.java index 41c7eee..0ef3325 100644 --- a/blight-common/src/main/java/de/blight/common/PlacedModelIO.java +++ b/blight-common/src/main/java/de/blight/common/PlacedModelIO.java @@ -8,10 +8,11 @@ import java.util.*; * Liest und schreibt platzierte Modelle als tab-separierte Textdatei * ({@code blight_objects.blo}) neben der Kartendatei. * - * Spalten (seit v3): + * Spalten (seit v4): * modelPath x y z rotY scale rotX rotZ solid texPath nmPath matPath meshFile animClip castShadow receiveShadow + * lod1Path lod2Path lod1Distance lod2Distance cullDistance * - * Alte Dateien mit 6 Spalten (v1/v2) werden gelesen; fehlende Felder erhalten Standardwerte. + * Alte Dateien mit 6 Spalten (v1/v2/v3) werden gelesen; fehlende Felder erhalten Standardwerte. */ public final class PlacedModelIO { @@ -25,11 +26,11 @@ public final class PlacedModelIO { Path p = getPath(); Files.createDirectories(p.getParent()); try (BufferedWriter w = Files.newBufferedWriter(p)) { - w.write("# modelPath\tx\ty\tz\trotY\tscale\trotX\trotZ\tsolid\ttexPath\tnmPath\tmatPath\tmeshFile\tanimClip\tcastShadow\treceiveShadow"); + w.write("# modelPath\tx\ty\tz\trotY\tscale\trotX\trotZ\tsolid\ttexPath\tnmPath\tmatPath\tmeshFile\tanimClip\tcastShadow\treceiveShadow\tlod1Path\tlod2Path\tlod1Distance\tlod2Distance\tcullDistance"); w.newLine(); for (PlacedModel m : models) { w.write(String.format(Locale.ROOT, - "%s\t%.5f\t%.5f\t%.5f\t%.5f\t%.5f\t%.5f\t%.5f\t%b\t%s\t%s\t%s\t%s\t%s\t%b\t%b%n", + "%s\t%.5f\t%.5f\t%.5f\t%.5f\t%.5f\t%.5f\t%.5f\t%b\t%s\t%s\t%s\t%s\t%s\t%b\t%b\t%s\t%s\t%.5f\t%.5f\t%.5f%n", m.modelPath(), m.x(), m.y(), m.z(), m.rotY(), m.scale(), @@ -37,7 +38,9 @@ public final class PlacedModelIO { m.solid(), nvl(m.texturePath()), nvl(m.normalMapPath()), nvl(m.materialPath()), nvl(m.meshFile()), nvl(m.animClip()), - m.castShadow(), m.receiveShadow())); + m.castShadow(), m.receiveShadow(), + nvl(m.lod1Path()), nvl(m.lod2Path()), + m.lod1Distance(), m.lod2Distance(), m.cullDistance())); } } } @@ -68,14 +71,25 @@ public final class PlacedModelIO { String animClip = f.length > 13 ? f[13] : ""; boolean castShadow = f.length > 14 ? Boolean.parseBoolean(f[14]) : true; boolean receiveShadow = f.length > 15 ? Boolean.parseBoolean(f[15]) : true; + String lod1Path = f.length > 16 ? f[16] : ""; + String lod2Path = f.length > 17 ? f[17] : ""; + float lod1Distance = f.length > 18 ? parseFloat(f[18], 30f) : 30f; + float lod2Distance = f.length > 19 ? parseFloat(f[19], 80f) : 80f; + float cullDistance = f.length > 20 ? parseFloat(f[20], 120f) : 120f; list.add(new PlacedModel(modelPath, x, y, z, rotY, rotX, rotZ, scale, solid, texPath, nmPath, matPath, meshFile, animClip, - castShadow, receiveShadow)); + castShadow, receiveShadow, + lod1Path, lod2Path, lod1Distance, lod2Distance, cullDistance)); } catch (NumberFormatException ignored) {} } return list; } private static String nvl(String s) { return s != null ? s : ""; } + + private static float parseFloat(String s, float def) { + try { return Float.parseFloat(s); } + catch (NumberFormatException e) { return def; } + } } diff --git a/blight-editor/src/main/java/de/blight/editor/EditorApp.java b/blight-editor/src/main/java/de/blight/editor/EditorApp.java index 95546ad..aeb6700 100644 --- a/blight-editor/src/main/java/de/blight/editor/EditorApp.java +++ b/blight-editor/src/main/java/de/blight/editor/EditorApp.java @@ -54,6 +54,7 @@ public class EditorApp extends Application { private Label statusLabel; private Label camCoordsLabel; private boolean launchGameAfterSave = false; + private Button gamePlayBtn; // Spielen-Button im Seitenpanel private VBox toolPanel; private BorderPane root; private Stage gameConsoleStage; @@ -64,7 +65,8 @@ public class EditorApp extends Application { private StackPane worldViewport; private VBox topBar; // MenuBar + aktuelle Toolbar private ToolBar worldToolBar; // Welt-Editor-Toolbar (Layer-Buttons) - private ImageView treePreviewView; // aktualisiert wenn JME3 Bild neu erstellt + private ImageView treePreviewView; // aktualisiert wenn JME3 Bild neu erstellt + private StackPane plantPreviewPanel; // einmaliges Vorschau-Panel für alle Generatoren private Stage primaryStage; // Baum-Generator-Zustand (wird beim Preset-Wechsel neu gesetzt) @@ -78,6 +80,12 @@ public class EditorApp extends Application { // Palmen-Generator-Zustand private PalmOptions palmOptions = new PalmOptions(); + // Farn-Generator-Zustand + private de.blight.editor.tree.FernOptions fernOptions = new de.blight.editor.tree.FernOptions(); + + // Vegetations-Generator-Zustand + private String vegetationType = "Baum (Eiche)"; + // Aktives Tool + Tastenkürzel-Callbacks private String currentTool = "world"; private Runnable onF5 = () -> {}; // Vorschau @@ -119,6 +127,15 @@ public class EditorApp extends Application { /** Relativer Asset-Pfad des aktuell geladenen Modells (für .animset.json-Persistenz). */ private String animCurrentModelPath = null; + // AnimSet-Editor + private ListView animSetClipListView; + private ListView animSetActionListView; + private String animSetPendingPlayClip = null; + private ComboBox animSetModelCombo; + private boolean animSetDirty = false; + private String animSetCurrentName = null; + private Path animSetCurrentDir = null; + // Character-Editor-Zustand private de.blight.editor.ui.DialogEditorView dialogEditorView; private javafx.scene.layout.VBox charEditContainer; // deaktiviert solange kein Character geladen @@ -187,12 +204,15 @@ public class EditorApp extends Application { private CheckBox modelEditorUniformCB; private boolean modelEditorSuppressListeners = false; private String modelEditorCurrentPath = null; + private String modelEditorLod1Path = ""; + private String modelEditorLod2Path = ""; + private Label modelEditorLod1Label; + private Label modelEditorLod2Label; // Asset-Overlay-Zustand - private boolean assetOverlayPinned = false; - private boolean assetOverlayOpen = false; + private boolean assetOverlayOpen = false; private Button assetTabBtn; - private javafx.animation.PauseTransition assetCloseDelay; + private StackPane centerStack; // persistenter Wrapper für alle 3D-Ansichten // Toolbar-Buttons (müssen vom Status-Poller erreichbar sein) private ToggleButton baseBtn; @@ -236,6 +256,7 @@ public class EditorApp extends Application { private TreeItem jmeModelsNode; private TreeItem jmeTexturesNode; private TreeItem animationsNode; + private TreeItem itemsNode; // ── JavaFX Entry-Point ─────────────────────────────────────────────────── @@ -281,8 +302,9 @@ public class EditorApp extends Application { topBar = buildTop(); root.setTop(topBar); worldViewport = buildViewport(); + centerStack = new StackPane(worldViewport); setupAssetOverlay(); - root.setCenter(worldViewport); + root.setCenter(centerStack); root.setRight(toolPanel); root.setBottom(buildBottomBox()); @@ -364,6 +386,11 @@ public class EditorApp extends Application { animClipListView.getItems().setAll(newClips); if (!newClips.isEmpty()) animClipListView.getSelectionModel().selectFirst(); } + // AnimSet-Editor: nach Clip-Load automatisch abspielen + if (newClips != null && animSetPendingPlayClip != null) { + input.animPreviewPlayClip = animSetPendingPlayClip; + animSetPendingPlayClip = null; + } String loadedPath = input.animPreviewLoadedPath.getAndSet(null); if (loadedPath != null) { animCurrentModelPath = loadedPath; @@ -393,9 +420,9 @@ public class EditorApp extends Application { if (input.refreshAssets) { input.refreshAssets = false; - refreshCategoryNode(modelsNode); - modelsNode.setExpanded(true); - refreshCategoryNode(animationsNode); + boolean pe = shouldPreserveExpansion(); + refreshCategoryNode(modelsNode, pe); + refreshCategoryNode(animationsNode, pe); refreshAddAnimCombo(addAnimComboField); } @@ -480,6 +507,20 @@ public class EditorApp extends Application { input.modelEditorBoundsD); } + // Modell-Editor: eingebettete LODs erkannt → Labels aktualisieren + if (input.modelEditorHasEmbeddedLods) { + if (modelEditorLod1Label != null + && "(nicht gesetzt)".equals(modelEditorLod1Label.getText())) { + modelEditorLod1Label.setText("(eingebettet im j3o)"); + modelEditorLod1Label.setStyle("-fx-text-fill:#6aaa6a; -fx-font-size:11;"); + } + if (modelEditorLod2Label != null + && "(nicht gesetzt)".equals(modelEditorLod2Label.getText())) { + modelEditorLod2Label.setText("(eingebettet im j3o)"); + modelEditorLod2Label.setStyle("-fx-text-fill:#6aaa6a; -fx-font-size:11;"); + } + } + // Kamera-Koordinaten aktualisieren camCoordsLabel.setText(String.format( "X:%.1f Y:%.1f Z:%.1f Yaw:%.0f° Pitch:%.0f°", @@ -532,30 +573,35 @@ public class EditorApp extends Application { // ── Modus-Wechsel ──────────────────────────────────────────────────────── - private void switchToTreeGenerator() { - currentTool = "tree"; - topBar.getChildren().set(1, buildTreeToolBar()); - root.setCenter(buildTreePreviewPanel()); - root.setRight(buildTreeParamsPanel()); + private void switchToVegetationGenerator() { + currentTool = "vegetation"; + topBar.getChildren().set(1, buildVegetationToolBar()); + setCenterView(getPlantPreviewPanel()); + root.setRight(buildVegetationParamsPanel()); } private void switchToWorldEditor() { - boolean wasObjEditor = "objecteditor".equals(currentTool); + boolean wasObjEditor = "objecteditor".equals(currentTool); + boolean wasModelEditor = "modeleditor".equals(currentTool); currentTool = "world"; topBar.getChildren().set(1, worldToolBar); - root.setCenter(worldViewport); + setCenterView(worldViewport); root.setRight(toolPanel); if (wasObjEditor && (input.activeLayer == SharedInput.LAYER_OBJECTS || input.activeLayer == SharedInput.LAYER_OBJECTS_EDIT)) { input.activeLayer = 0; if (baseBtn != null) baseBtn.setSelected(true); + } else if (wasModelEditor) { + input.activeLayer = 0; + input.modelEditorOpenPath = null; + if (baseBtn != null) baseBtn.setSelected(true); } } private void switchToObjectEditor(boolean placeMode) { currentTool = "objecteditor"; topBar.getChildren().set(1, buildObjectEditorToolBar(placeMode)); - root.setCenter(worldViewport); + setCenterView(worldViewport); if (placeMode) { input.activeLayer = SharedInput.LAYER_OBJECTS; root.setRight(buildObjectPlacePanel()); @@ -600,18 +646,196 @@ public class EditorApp extends Application { return tb; } + private ToolBar buildModelEditorToolBar() { + Button backBtn = new Button("← Welteneditor"); + backBtn.setOnAction(e -> switchToWorldEditor()); + Label label = new Label("Model Editor"); + label.setStyle("-fx-font-weight: bold; -fx-font-size: 13;"); + + ToggleButton lod0Btn = new ToggleButton("LOD 0"); + ToggleButton lod1Btn = new ToggleButton("LOD 1"); + ToggleButton lod2Btn = new ToggleButton("LOD 2"); + javafx.scene.control.ToggleGroup lodGroup = new javafx.scene.control.ToggleGroup(); + lod0Btn.setToggleGroup(lodGroup); lod1Btn.setToggleGroup(lodGroup); lod2Btn.setToggleGroup(lodGroup); + lod0Btn.setSelected(true); + String lodStyle = "-fx-font-size:11; -fx-padding:2 8 2 8;"; + lod0Btn.setStyle(lodStyle); lod1Btn.setStyle(lodStyle); lod2Btn.setStyle(lodStyle); + lod0Btn.setOnAction(e -> { input.modelEditorLodPreview = 0; input.modelEditorLodChanged = true; }); + lod1Btn.setOnAction(e -> { input.modelEditorLodPreview = 1; input.modelEditorLodChanged = true; }); + lod2Btn.setOnAction(e -> { input.modelEditorLodPreview = 2; input.modelEditorLodChanged = true; }); + + ToolBar tb = new ToolBar(); + tb.getItems().addAll(backBtn, new Separator(Orientation.VERTICAL), label, + new Separator(Orientation.VERTICAL), lod0Btn, lod1Btn, lod2Btn); + return tb; + } + private void switchToEzTree() { currentTool = "eztree"; topBar.getChildren().set(1, buildEzTreeToolBar()); - root.setCenter(buildTreePreviewPanel()); + setCenterView(getPlantPreviewPanel()); root.setRight(buildEzTreeParamsPanel()); } - private void switchToPalm() { - currentTool = "palm"; - topBar.getChildren().set(1, buildPalmToolBar()); - root.setCenter(buildTreePreviewPanel()); - root.setRight(buildPalmParamsPanel()); + private ToolBar buildVegetationToolBar() { + Button backBtn = new Button("← Welteneditor"); + backBtn.setOnAction(e -> switchToWorldEditor()); + + Label typeLabel = new Label("Pflanzentyp:"); + typeLabel.setStyle("-fx-font-weight: bold;"); + ComboBox typeBox = new ComboBox<>(); + typeBox.getItems().addAll( + "Baum (Eiche)", "Baum (Birke)", "Baum (Kiefer)", "Baum (Weide)", "Baum (Busch)", + "Farn", "Palme"); + typeBox.setValue(vegetationType); + typeBox.setOnAction(e -> { + vegetationType = typeBox.getValue(); + if (vegetationType.startsWith("Baum (")) { + currentTreePreset = vegetationType.substring(6, vegetationType.length() - 1); + treeParams = presetFromName(currentTreePreset); + } + updateVegetationOnF5(); + root.setRight(buildVegetationParamsPanel()); + onF5.run(); + }); + + Button previewBtn = new Button("▶ Vorschau [F5]"); + previewBtn.setStyle("-fx-font-weight: bold;"); + previewBtn.setOnAction(e -> onF5.run()); + + Button exportBtn = new Button("💾 Export .j3o"); + exportBtn.setOnAction(e -> { + if (vegetationType.startsWith("Baum (")) { + input.treeGenQueue.offer(new SharedInput.TreeGenRequest( + treeParams.copy(), true, treeTypeFromPreset(currentTreePreset))); + } else if ("Farn".equals(vegetationType)) { + input.fernGenQueue.offer(new SharedInput.FernGenRequest(fernOptions.copy(), true)); + } else { + input.palmGenQueue.offer(new SharedInput.PalmGenRequest(palmOptions.copy(), true)); + } + setStatus("Generiere und exportiere…"); + }); + + Button rndBtn = new Button("🎲 Neuer Seed"); + rndBtn.setOnAction(e -> onF6.run()); + + updateVegetationOnF5(); + + ToolBar bar = new ToolBar(); + bar.getItems().addAll(backBtn, new Separator(Orientation.VERTICAL), + typeLabel, typeBox, + new Separator(Orientation.VERTICAL), + previewBtn, exportBtn, rndBtn); + return bar; + } + + private void updateVegetationOnF5() { + if (vegetationType.startsWith("Baum (")) { + onF5 = () -> { + input.treeGenQueue.offer(new SharedInput.TreeGenRequest( + treeParams.copy(), false, treeTypeFromPreset(currentTreePreset))); + setStatus("Generiere Vorschau…"); + }; + onF6 = () -> { + int s = new java.util.Random().nextInt(100000); + treeParams.seed = s; + onF5.run(); + }; + } else if ("Farn".equals(vegetationType)) { + onF5 = () -> { + input.fernGenQueue.offer(new SharedInput.FernGenRequest(fernOptions.copy(), false)); + setStatus("Generiere Farn-Vorschau…"); + }; + onF6 = () -> { + fernOptions.seed = new java.util.Random().nextInt(1000000); + root.setRight(buildVegetationParamsPanel()); + onF5.run(); + }; + } else { + onF5 = () -> { + input.palmGenQueue.offer(new SharedInput.PalmGenRequest(palmOptions.copy(), false)); + setStatus("Palme: generiere Vorschau…"); + }; + onF6 = () -> { + palmOptions.seed = new java.util.Random().nextInt(1000000); + root.setRight(buildVegetationParamsPanel()); + onF5.run(); + }; + } + } + + private javafx.scene.Node buildVegetationParamsPanel() { + if (vegetationType.startsWith("Baum (")) { + return buildTreeParamsPanel(); + } else if ("Farn".equals(vegetationType)) { + return buildFernParamsPanel(); + } else { + return buildPalmParamsPanel(); + } + } + + private VBox buildFernParamsPanel() { + VBox inner = new VBox(8); + inner.setPadding(new Insets(10)); + + inner.getChildren().addAll(sectionTitle("Allgemein"), new Separator()); + inner.getChildren().add(bold("Zufallssamen:")); + Spinner seedSp = intSpinner(0, 999999, fernOptions.seed); + seedSp.valueProperty().addListener((o, a, b) -> fernOptions.seed = b); + Button rndSeedBtn = new Button("🎲"); + rndSeedBtn.setOnAction(e -> { + int s = new java.util.Random().nextInt(1000000); + fernOptions.seed = s; + seedSp.getValueFactory().setValue(s); + if (onF5 != null) onF5.run(); + }); + HBox seedRow = new HBox(4, seedSp, rndSeedBtn); + HBox.setHgrow(seedSp, Priority.ALWAYS); + inner.getChildren().add(seedRow); + + inner.getChildren().addAll(sectionTitle("Fächer"), new Separator()); + inner.getChildren().add(bold("Anzahl Fächer:")); + Spinner frondCountSp = intSpinner(3, 30, fernOptions.frondCount); + frondCountSp.valueProperty().addListener((o, a, b) -> fernOptions.frondCount = b); + inner.getChildren().add(frondCountSp); + + inner.getChildren().add(ezFloat("Länge (m):", 0.2, 2.0, fernOptions.frondLength, + v -> fernOptions.frondLength = v)); + inner.getChildren().add(ezFloat("Neigung min (°):", 0.0, 90.0, fernOptions.tiltMin, + v -> fernOptions.tiltMin = v)); + inner.getChildren().add(ezFloat("Neigung max (°):", 0.0, 90.0, fernOptions.tiltMax, + v -> fernOptions.tiltMax = v)); + inner.getChildren().add(ezFloat("Durchhang:", 0.0, 1.0, fernOptions.droop, + v -> fernOptions.droop = v)); + + inner.getChildren().addAll(sectionTitle("Segmente & Wind"), new Separator()); + inner.getChildren().add(bold("Segmente pro Fächer:")); + Spinner segSp = intSpinner(2, 12, fernOptions.frondSegments); + segSp.valueProperty().addListener((o, a, b) -> fernOptions.frondSegments = b); + inner.getChildren().add(segSp); + + inner.getChildren().add(ezFloat("Windstärke:", 0.0, 0.5, fernOptions.windStrength, + v -> fernOptions.windStrength = v)); + inner.getChildren().add(ezFloat("Windgeschwindigkeit:", 0.1, 2.0, fernOptions.windSpeed, + v -> fernOptions.windSpeed = v)); + + Button previewBtn = new Button("▶ Vorschau"); + previewBtn.setMaxWidth(Double.MAX_VALUE); + previewBtn.setStyle("-fx-background-color:#2d8a3e;-fx-text-fill:white;-fx-font-weight:bold;-fx-padding:6 12 6 12;"); + previewBtn.setOnAction(e -> { if (onF5 != null) onF5.run(); }); + + inner.getChildren().add(new Separator()); + inner.getChildren().add(previewBtn); + + ScrollPane scroll = new ScrollPane(inner); + scroll.setFitToWidth(true); + scroll.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); + scroll.setStyle("-fx-background-color:transparent;-fx-background:transparent;"); + VBox panel = new VBox(scroll); + VBox.setVgrow(scroll, Priority.ALWAYS); + panel.setPrefWidth(270); + panel.setStyle("-fx-background-color:#f0f0f0;-fx-border-color:#ccc;-fx-border-width:0 0 0 1;"); + return panel; } private void switchToTripo() { @@ -646,37 +870,35 @@ public class EditorApp extends Application { fileMenu.getItems().addAll(newItem, saveItem); Menu toolsMenu = new Menu("Werkzeuge"); - MenuItem treeGenItem = new MenuItem("Baum Generator (blight)"); - MenuItem ezTreeItem = new MenuItem("Baum Generator (EZ Tree)"); - MenuItem palmItem = new MenuItem("Baum Generator (Palme)"); - MenuItem tripoItem = new MenuItem("AI Modell-Generator (Tripo3D)"); - MenuItem animPrevItem = new MenuItem("Animationseditor"); - MenuItem objEditorItem = new MenuItem("Objekt Editor"); - MenuItem worldEditItem = new MenuItem("Welteneditor"); - MenuItem charEditItem = new MenuItem("Character Editor"); - MenuItem questEditItem = new MenuItem("Quest-Manager"); - MenuItem itemEditItem = new MenuItem("Item-Manager"); + MenuItem vegetationsItem = new MenuItem("Vegetations Generator"); + MenuItem ezTreeItem = new MenuItem("Baum Generator (EZ Tree)"); + MenuItem tripoItem = new MenuItem("AI Modell-Generator (Tripo3D)"); + MenuItem animPrevItem = new MenuItem("Animationseditor"); + MenuItem objEditorItem = new MenuItem("Model Editor"); + MenuItem worldEditItem = new MenuItem("Welteneditor"); + MenuItem charEditItem = new MenuItem("Character Editor"); + MenuItem questEditItem = new MenuItem("Quest-Manager"); + MenuItem itemEditItem = new MenuItem("Item-Manager"); MenuItem recipeEditItem = new MenuItem("Rezept-Manager"); MenuItem ctEditItem = new MenuItem("Crafting-Table-Manager"); MenuItem fractionEditItem = new MenuItem("Fraktionen-Manager"); MenuItem locationEditItem = new MenuItem("Locations-Manager"); MenuItem localizationEditItem = new MenuItem("Lokalisierungs-Editor"); - treeGenItem.setOnAction(e -> switchToTreeGenerator()); - ezTreeItem.setOnAction(e -> switchToEzTree()); - palmItem.setOnAction(e -> switchToPalm()); - tripoItem.setOnAction(e -> switchToTripo()); - animPrevItem.setOnAction(e -> switchToAnimPreview()); - objEditorItem.setOnAction(e -> switchToObjectEditor(true)); - worldEditItem.setOnAction(e -> switchToWorldEditor()); - charEditItem.setOnAction(e -> switchToCharacterEditor()); - questEditItem.setOnAction(e -> switchToQuestEditor()); - itemEditItem.setOnAction(e -> switchToItemEditor()); - recipeEditItem.setOnAction(e -> switchToRecipeEditor()); + vegetationsItem.setOnAction(e -> switchToVegetationGenerator()); + ezTreeItem.setOnAction(e -> switchToEzTree()); + tripoItem.setOnAction(e -> switchToTripo()); + animPrevItem.setOnAction(e -> switchToAnimPreview()); + objEditorItem.setOnAction(e -> openModelEditor(null, null)); + worldEditItem.setOnAction(e -> switchToWorldEditor()); + charEditItem.setOnAction(e -> switchToCharacterEditor()); + questEditItem.setOnAction(e -> switchToQuestEditor()); + itemEditItem.setOnAction(e -> switchToItemEditor()); + recipeEditItem.setOnAction(e -> switchToRecipeEditor()); ctEditItem.setOnAction(e -> switchToCraftingTableEditor()); fractionEditItem.setOnAction(e -> switchToFractionEditor()); locationEditItem.setOnAction(e -> switchToLocationEditor()); localizationEditItem.setOnAction(e -> switchToLocalizationEditor()); - toolsMenu.getItems().addAll(treeGenItem, ezTreeItem, palmItem, tripoItem, + toolsMenu.getItems().addAll(vegetationsItem, ezTreeItem, tripoItem, animPrevItem, objEditorItem, worldEditItem, charEditItem, questEditItem, itemEditItem, recipeEditItem, ctEditItem, fractionEditItem, locationEditItem, localizationEditItem); @@ -765,11 +987,15 @@ public class EditorApp extends Application { }); objPlaceBtn.setOnAction(e -> { input.activeLayer = SharedInput.LAYER_OBJECTS; + if (modelsNode != null) modelsNode.setExpanded(true); + openAssetOverlay(); root.setRight(buildObjectPlacePanel()); }); objEditBtn.setOnAction(e -> { input.activeLayer = SharedInput.LAYER_OBJECTS_EDIT; input.pendingModelPath = null; + if (modelsNode != null) modelsNode.setExpanded(true); + openAssetOverlay(); root.setRight(buildObjectEditPanel()); }); lightBtn.setOnAction(e -> { @@ -824,68 +1050,33 @@ public class EditorApp extends Application { // ── Baum-Generator – Toolbar (ersetzt die Welt-Toolbar) ────────────────── - private ToolBar buildTreeToolBar() { - Label presetLabel = new Label("Baumart:"); - presetLabel.setStyle("-fx-font-weight: bold;"); - ComboBox presetBox = new ComboBox<>(); - presetBox.getItems().addAll("Eiche", "Birke", "Kiefer", "Weide", "Busch"); - presetBox.setValue("Eiche"); - presetBox.setOnAction(e -> { - currentTreePreset = presetBox.getValue(); - treeParams = presetFromName(currentTreePreset); - root.setRight(buildTreeParamsPanel()); - }); - - onF5 = () -> { - input.treeGenQueue.offer(new SharedInput.TreeGenRequest( - treeParams.copy(), false, treeTypeFromPreset(currentTreePreset))); - setStatus("Generiere Vorschau…"); - }; - Button previewBtn = new Button("▶ Vorschau [F5]"); - previewBtn.setStyle("-fx-font-weight: bold;"); - previewBtn.setOnAction(e -> onF5.run()); - - Button exportBtn = new Button("💾 Exportieren als .j3o"); - exportBtn.setOnAction(e -> { - input.treeGenQueue.offer(new SharedInput.TreeGenRequest( - treeParams.copy(), true, treeTypeFromPreset(currentTreePreset))); - setStatus("Generiere und exportiere…"); - }); - - ToolBar bar = new ToolBar(); - bar.getItems().addAll( - presetLabel, presetBox, - new Separator(Orientation.VERTICAL), - previewBtn, exportBtn - ); - return bar; - } - // ── Baum-Generator – zentrales Vorschau-Panel (ersetzt den Welt-Viewport) ── - private StackPane buildTreePreviewPanel() { + private StackPane getPlantPreviewPanel() { + if (plantPreviewPanel != null) return plantPreviewPanel; + treePreviewView = new ImageView(input.treePreviewImage); treePreviewView.setPreserveRatio(true); treePreviewView.setSmooth(true); - StackPane previewPane = new StackPane(treePreviewView); - previewPane.setStyle("-fx-background-color: #1e2433;"); - previewPane.widthProperty().addListener((o, ow, nw) -> { + StackPane pane = new StackPane(treePreviewView); + pane.setStyle("-fx-background-color: #1e2433;"); + pane.widthProperty().addListener((o, ow, nw) -> { treePreviewView.setFitWidth(nw.doubleValue()); input.treePreviewW = Math.max(64, nw.intValue()); }); - previewPane.heightProperty().addListener((o, oh, nh) -> { + pane.heightProperty().addListener((o, oh, nh) -> { treePreviewView.setFitHeight(nh.doubleValue()); input.treePreviewH = Math.max(64, nh.intValue()); }); double[] prevMX = {0}, prevMY = {0}; - previewPane.setOnMousePressed(e -> { + pane.setOnMousePressed(e -> { boolean mid = e.getButton() == MouseButton.MIDDLE; boolean both = e.isPrimaryButtonDown() && e.isSecondaryButtonDown(); if (mid || both) { prevMX[0] = e.getX(); prevMY[0] = e.getY(); } }); - previewPane.setOnMouseDragged(e -> { + pane.setOnMouseDragged(e -> { boolean both = e.isPrimaryButtonDown() && e.isSecondaryButtonDown(); if (e.isMiddleButtonDown() || both) { double dx = e.getX() - prevMX[0]; @@ -896,13 +1087,14 @@ public class EditorApp extends Application { prevMX[0] = e.getX(); prevMY[0] = e.getY(); } }); - previewPane.setOnScroll(e -> { + pane.setOnScroll(e -> { float factor = e.getDeltaY() > 0 ? 0.88f : 1.14f; input.treePreviewZoom = (float) Math.max(0.25, Math.min(4.0, input.treePreviewZoom * factor)); }); - return previewPane; + plantPreviewPanel = pane; + return plantPreviewPanel; } // ── Baum-Generator – rechtes Parameter-Panel ───────────────────────────── @@ -1229,28 +1421,6 @@ public class EditorApp extends Application { return panel; } - // ── Palmen-Generator – Toolbar ─────────────────────────────────────────── - - private ToolBar buildPalmToolBar() { - onF5 = () -> { - input.palmGenQueue.offer(new SharedInput.PalmGenRequest(palmOptions.copy(), false)); - setStatus("Palme: generiere Vorschau…"); - }; - Button previewBtn = new Button("▶ Vorschau [F5]"); - previewBtn.setStyle("-fx-font-weight: bold;"); - previewBtn.setOnAction(e -> onF5.run()); - - Button exportBtn = new Button("💾 Export .j3o"); - exportBtn.setOnAction(e -> { - input.palmGenQueue.offer(new SharedInput.PalmGenRequest(palmOptions.copy(), true)); - setStatus("Palme: generiere und exportiere…"); - }); - - ToolBar bar = new ToolBar(); - bar.getItems().addAll(previewBtn, exportBtn); - return bar; - } - // ── Palmen-Generator – Parameter-Panel ────────────────────────────────── private VBox buildPalmParamsPanel() { @@ -1472,6 +1642,36 @@ public class EditorApp extends Application { }; } + // ── Item-Platzierung ───────────────────────────────────────────────────── + + private void activateItemPlacement(java.nio.file.Path itemFile) { + String itemId = itemFile.getFileName().toString().replace(".item", ""); + input.pendingItemId = itemId; + input.activeLayer = SharedInput.LAYER_ITEMS; + openAssetOverlay(); + root.setRight(buildItemPlacePanel(itemId)); + setStatus("Item: " + itemId + " | Linksklick ins Terrain zum Platzieren | Rechtsklick = Abbrechen"); + } + + private VBox buildItemPlacePanel(String itemId) { + VBox inner = new VBox(8); + inner.setPadding(new Insets(10)); + inner.getChildren().addAll(sectionTitle("Item platzieren"), new Separator()); + Label idLabel = new Label("Item-ID: " + itemId); + idLabel.setWrapText(true); + idLabel.setStyle("-fx-font-weight:bold; -fx-text-fill: #222;"); + inner.getChildren().add(idLabel); + inner.getChildren().add(styledHint("Linksklick ins Terrain → Item platzieren")); + inner.getChildren().add(styledHint("Rechtsklick → Platzierung abbrechen")); + ScrollPane sp = new ScrollPane(inner); + sp.setFitToWidth(true); + sp.setStyle("-fx-background-color: transparent;"); + VBox wrapper = new VBox(sp); + wrapper.setPrefWidth(220); + wrapper.setStyle("-fx-background-color: #f8f8f8;"); + return wrapper; + } + // ── Objekt-Werkzeug – Platzieren-Panel ────────────────────────────────── private VBox buildObjectPlacePanel() { @@ -2980,17 +3180,7 @@ public class EditorApp extends Application { Label title = new Label("Assets"); title.setStyle("-fx-font-weight: bold; -fx-font-size: 13;"); - ToggleButton pinBtn = new ToggleButton("📌"); - pinBtn.setStyle("-fx-font-size: 10; -fx-background-radius: 4; -fx-padding: 2 5 2 5;"); - pinBtn.setTooltip(new Tooltip("Panel geöffnet lassen")); - pinBtn.selectedProperty().addListener((obs, old, nv) -> { - assetOverlayPinned = nv; - if (nv && assetCloseDelay != null) assetCloseDelay.stop(); - }); - - Region titleSpacer = new Region(); - HBox.setHgrow(titleSpacer, Priority.ALWAYS); - HBox titleBar = new HBox(4, title, titleSpacer, pinBtn); + HBox titleBar = new HBox(4, title); titleBar.setAlignment(Pos.CENTER_LEFT); assetTreeRoot = new TreeItem<>("Projekt"); @@ -3007,7 +3197,7 @@ public class EditorApp extends Application { if (e.getCode() != KeyCode.F2) return; TreeItem sel = tree.getSelectionModel().getSelectedItem(); if (sel == null || sel == modelsNode || sel == texturesNode - || sel == audioNode || sel == animationsNode) return; + || sel == audioNode || sel == animationsNode || sel == itemsNode) return; renameAsset(sel); e.consume(); }); @@ -3039,11 +3229,12 @@ public class EditorApp extends Application { return; } + if (cat == itemsNode && relPath.endsWith(".item")) { + activateItemPlacement(p); + return; + } + if (cat == modelsNode) { - if (relPath.endsWith(".j3o")) { - openModelEditor(relPath, p); - return; - } input.pendingModelPath = relPath; input.activeLayer = SharedInput.LAYER_OBJECTS; if (objPlaceBtn != null) objPlaceBtn.setSelected(true); @@ -3060,7 +3251,7 @@ public class EditorApp extends Application { input.animPreviewLoadPath = relPath; if (animPreviewStatusLabel != null) animPreviewStatusLabel.setText("Lade…"); } else if (relPath.endsWith(".animset.json")) { - switchToAnimPreview(); + openAnimSetEditor(relPath, p); } else if (relPath.endsWith(".character")) { String charName = p.getFileName().toString().replace(".character", ""); Path charDir = ASSET_ROOT.resolve("character"); @@ -3086,7 +3277,7 @@ public class EditorApp extends Application { Button refreshBtn = new Button("↻"); refreshBtn.setTooltip(new javafx.scene.control.Tooltip("Asset-Baum aktualisieren")); - refreshBtn.setOnAction(e -> refreshAllAssets()); + refreshBtn.setOnAction(e -> refreshAllAssets(shouldPreserveExpansion())); HBox bottomBar = new HBox(4, importBtn, refreshBtn); HBox.setHgrow(importBtn, Priority.ALWAYS); @@ -3096,49 +3287,44 @@ public class EditorApp extends Application { return panel; } + // ── Zentralansicht wechseln (Asset-Overlay bleibt sichtbar) ────────────── + + private void setCenterView(javafx.scene.Node view) { + centerStack.getChildren().set(0, view); + if (root.getCenter() != centerStack) root.setCenter(centerStack); + } + // ── Asset-Overlay ───────────────────────────────────────────────────────── private void setupAssetOverlay() { - assetCloseDelay = new javafx.animation.PauseTransition(javafx.util.Duration.millis(350)); - assetCloseDelay.setOnFinished(e -> closeAssetOverlay()); - assetPanel.setMaxWidth(420); assetPanel.setMaxHeight(Double.MAX_VALUE); - assetPanel.setTranslateX(-420); + assetPanel.setTranslateX(0); StackPane.setAlignment(assetPanel, Pos.TOP_LEFT); assetPanel.setEffect(new javafx.scene.effect.DropShadow( 14, 5, 0, javafx.scene.paint.Color.rgb(0, 0, 0, 0.55))); assetTabBtn = new Button("›"); - assetTabBtn.setPrefSize(18, 60); + assetTabBtn.setPrefSize(26, 80); assetTabBtn.setStyle( - "-fx-background-color: #4a4a5a; -fx-text-fill: #ddd; -fx-font-size: 14; " + - "-fx-background-radius: 0 5 5 0; -fx-border-width: 0; -fx-cursor: hand; -fx-padding: 0;"); + "-fx-background-color: #4a4a5a; -fx-text-fill: #ddd; -fx-font-size: 18; " + + "-fx-background-radius: 0 6 6 0; -fx-border-width: 0; -fx-cursor: hand; -fx-padding: 0;"); StackPane.setAlignment(assetTabBtn, Pos.CENTER_LEFT); - assetTabBtn.setTranslateX(0); assetPanel.translateXProperty().addListener((obs, old, nv) -> assetTabBtn.setTranslateX(nv.doubleValue() + 420)); assetTabBtn.setOnMouseClicked(e -> { - assetCloseDelay.stop(); if (assetOverlayOpen) closeAssetOverlay(); else openAssetOverlay(); }); - assetTabBtn.setOnMouseEntered(e -> { - assetCloseDelay.stop(); - if (!assetOverlayOpen) openAssetOverlay(); - }); - assetTabBtn.setOnMouseExited(e -> { - if (!assetOverlayPinned) assetCloseDelay.playFromStart(); - }); - assetPanel.setOnMouseEntered(e -> assetCloseDelay.stop()); - assetPanel.setOnMouseExited(e -> { - if (!assetOverlayPinned) assetCloseDelay.playFromStart(); - }); + // Panel startet ausgeklappt + assetOverlayOpen = true; + assetTabBtn.setText("‹"); + assetTabBtn.setTranslateX(420); - worldViewport.getChildren().addAll(assetPanel, assetTabBtn); + centerStack.getChildren().addAll(assetPanel, assetTabBtn); } private void openAssetOverlay() { @@ -3156,7 +3342,7 @@ public class EditorApp extends Application { assetOverlayOpen = false; assetTabBtn.setText("›"); javafx.animation.TranslateTransition tt = new javafx.animation.TranslateTransition( - javafx.util.Duration.millis(200), assetPanel); + javafx.util.Duration.millis(150), assetPanel); tt.setToX(-420); tt.play(); } @@ -3249,7 +3435,7 @@ public class EditorApp extends Application { ctx.getItems().add(newSub); boolean isCatRoot = (item == modelsNode || item == texturesNode - || item == audioNode || item == animationsNode); + || item == audioNode || item == animationsNode || item == itemsNode); Path dir = itemPaths.get(item); if (item == animationsNode) { @@ -3258,6 +3444,13 @@ public class EditorApp extends Application { ctx.getItems().add(importAnim); } + Path setsDir = ASSET_ROOT.resolve("animations").resolve("sets"); + if (dir != null && setsDir.equals(dir)) { + MenuItem newSet = new MenuItem("➕ Neues Set…"); + newSet.setOnAction(ev -> createNewAnimSet()); + ctx.getItems().add(newSet); + } + if (!isCatRoot && dir != null) { MenuItem rename = new MenuItem("✏ Umbenennen…"); rename.setOnAction(ev -> renameAsset(item)); @@ -3292,6 +3485,20 @@ public class EditorApp extends Application { String pStr = p.toString(); if (pStr.endsWith(".j3o")) { String relPath = ASSET_ROOT.relativize(p).toString().replace('\\', '/'); + + MenuItem placeModel = new MenuItem("📦 Platzieren"); + placeModel.setOnAction(ev -> { + input.pendingModelPath = relPath; + input.activeLayer = SharedInput.LAYER_OBJECTS; + if (objPlaceBtn != null) objPlaceBtn.setSelected(true); + openAssetOverlay(); + root.setRight(buildObjectPlacePanel()); + setStatus("Modell: " + relPath + " | Linksklick ins Terrain zum Platzieren"); + }); + MenuItem openEditor = new MenuItem("🔧 Im Model Editor öffnen"); + openEditor.setOnAction(ev -> openModelEditor(relPath, p)); + ctx.getItems().addAll(placeModel, openEditor, new SeparatorMenuItem()); + boolean skeletal = skeletalModelPaths == null || skeletalModelPaths.contains(relPath); if (skeletal) { @@ -3306,6 +3513,19 @@ public class EditorApp extends Application { } } + if (pStr.endsWith(".animset.json")) { + String animSetRel = ASSET_ROOT.relativize(p).toString().replace('\\', '/'); + MenuItem editSet = new MenuItem("✏ AnimSet bearbeiten"); + editSet.setOnAction(ev -> openAnimSetEditor(animSetRel, p)); + ctx.getItems().addAll(editSet, new SeparatorMenuItem()); + } + + if (pStr.endsWith(".item")) { + MenuItem placeItem = new MenuItem("📍 Platzieren"); + placeItem.setOnAction(ev -> activateItemPlacement(p)); + ctx.getItems().addAll(placeItem, new SeparatorMenuItem()); + } + MenuItem reveal = new MenuItem("Im Dateisystem anzeigen"); reveal.setOnAction(ev -> { try { Runtime.getRuntime().exec( @@ -3357,10 +3577,11 @@ public class EditorApp extends Application { return p != null && Files.isDirectory(p); } - /** Findet die übergeordnete Kategorie (modelsNode / texturesNode / audioNode / animationsNode). */ + /** Findet die übergeordnete Kategorie (modelsNode / texturesNode / audioNode / animationsNode / itemsNode). */ private TreeItem getCategoryRoot(TreeItem item) { for (TreeItem cur = item; cur != null; cur = cur.getParent()) - if (cur == modelsNode || cur == texturesNode || cur == audioNode || cur == animationsNode) return cur; + if (cur == modelsNode || cur == texturesNode || cur == audioNode + || cur == animationsNode || cur == itemsNode) return cur; return null; } @@ -3598,6 +3819,7 @@ public class EditorApp extends Application { loadAssetsRecursive(sub, p, exts); } else { String lo = p.getFileName().toString().toLowerCase(); + if (lo.endsWith(".meta")) continue; boolean include = exts.length == 0 || java.util.Arrays.stream(exts).anyMatch(lo::endsWith); if (include) { @@ -3617,7 +3839,7 @@ public class EditorApp extends Application { */ private void populateAssetTree(TreeItem root) { modelsNode = null; texturesNode = null; - audioNode = null; animationsNode = null; + audioNode = null; animationsNode = null; itemsNode = null; jmeModelsNode = null; jmeTexturesNode = null; jmeFolderNodes.clear(); @@ -3652,12 +3874,15 @@ public class EditorApp extends Application { } case "audio" -> audioNode = node; case "animations" -> animationsNode = node; + case "items" -> itemsNode = node; } } } - /** Baut den Teilbaum einer Kategorie komplett neu auf. */ - private void refreshCategoryNode(TreeItem catNode) { + /** Baut den Teilbaum einer Kategorie komplett neu auf. + * @param preserveExpansion true → aufgeklappte Knoten bleiben nach dem Rebuild erhalten */ + private void refreshCategoryNode(TreeItem catNode, boolean preserveExpansion) { + java.util.Set expanded = preserveExpansion ? collectExpandedPaths() : java.util.Set.of(); clearItemPathsFor(catNode); catNode.getChildren().clear(); Path dir = itemPaths.get(catNode); @@ -3666,15 +3891,60 @@ public class EditorApp extends Application { catNode.getChildren().add(jmeModelsNode); if (catNode == texturesNode && jmeTexturesNode != null) catNode.getChildren().add(jmeTexturesNode); + if (preserveExpansion) { + restoreExpansion(expanded); + catNode.setExpanded(true); + } } - /** Baut den gesamten Asset-Baum neu aus dem Dateisystem auf. */ - private void refreshAllAssets() { + /** Baut den gesamten Asset-Baum neu aus dem Dateisystem auf. + * @param preserveExpansion true → aufgeklappte Knoten bleiben nach dem Rebuild erhalten */ + private void refreshAllAssets(boolean preserveExpansion) { if (assetTreeRoot == null) return; + java.util.Set expanded = preserveExpansion ? collectExpandedPaths() : java.util.Set.of(); itemPaths.clear(); jmePaths.clear(); assetTreeRoot.getChildren().clear(); populateAssetTree(assetTreeRoot); + if (preserveExpansion) restoreExpansion(expanded); + } + + /** Gibt zurück, ob das aktive Tool den aufgeklappten Zustand des Asset-Baums behalten soll. */ + private boolean shouldPreserveExpansion() { + return "vegetation".equals(currentTool) || "eztree".equals(currentTool) + || "objecteditor".equals(currentTool) + || ("world".equals(currentTool) + && (input.activeLayer == SharedInput.LAYER_OBJECTS + || input.activeLayer == SharedInput.LAYER_OBJECTS_EDIT)); + } + + /** Sammelt die Pfade (Name-Kette mit '/') aller aufgeklappten TreeItems. */ + private java.util.Set collectExpandedPaths() { + java.util.Set result = new java.util.HashSet<>(); + collectExpandedPaths(assetTreeRoot, "", result); + return result; + } + + private void collectExpandedPaths(TreeItem node, String prefix, java.util.Set result) { + for (TreeItem child : node.getChildren()) { + String path = prefix.isEmpty() ? child.getValue() : prefix + "/" + child.getValue(); + if (child.isExpanded()) result.add(path); + collectExpandedPaths(child, path, result); + } + } + + /** Klappt alle TreeItems wieder auf, deren Pfad in {@code expanded} enthalten ist. */ + private void restoreExpansion(java.util.Set expanded) { + if (expanded.isEmpty()) return; + restoreExpansion(assetTreeRoot, "", expanded); + } + + private void restoreExpansion(TreeItem node, String prefix, java.util.Set expanded) { + for (TreeItem child : node.getChildren()) { + String path = prefix.isEmpty() ? child.getValue() : prefix + "/" + child.getValue(); + if (expanded.contains(path)) child.setExpanded(true); + restoreExpansion(child, path, expanded); + } } private void clearItemPathsFor(TreeItem item) { @@ -3842,6 +4112,27 @@ public class EditorApp extends Application { private void openModelEditor(String relPath, java.nio.file.Path absolutePath) { modelEditorCurrentPath = relPath; + currentTool = "modeleditor"; + topBar.getChildren().set(1, buildModelEditorToolBar()); + input.activeLayer = SharedInput.LAYER_MODEL_EDITOR; + openAssetOverlay(); + + if (relPath == null) { + // Kein Modell vorausgewählt – Platzhalter zeigen + VBox placeholder = new VBox(12); + placeholder.setPadding(new javafx.geometry.Insets(16)); + placeholder.setPrefWidth(300); + placeholder.setStyle("-fx-background-color: #2a2a3e;"); + Label title = new Label("Modell-Editor"); + title.setStyle("-fx-font-weight:bold; -fx-font-size:14; -fx-text-fill:#ddd;"); + Label hint = new Label("Modell im Asset-Baum\nper Rechtsklick → Im Objekt-Editor öffnen\nauswählen."); + hint.setStyle("-fx-text-fill:#888; -fx-font-size:12;"); + hint.setWrapText(true); + placeholder.getChildren().addAll(title, hint); + root.setRight(placeholder); + setStatus("Modell-Editor: Modell aus Asset-Baum wählen"); + return; + } // Meta laden de.blight.common.ModelMeta meta = absolutePath != null && absolutePath.toFile().exists() @@ -3854,7 +4145,12 @@ public class EditorApp extends Application { input.modelEditorScaleZ = meta.scaleZ(); input.modelEditorPivotY = meta.pivotOffsetY(); input.modelEditorOpenPath = relPath; - input.activeLayer = SharedInput.LAYER_MODEL_EDITOR; + + modelEditorLod1Path = meta.lod1Path(); + modelEditorLod2Path = meta.lod2Path(); + input.modelEditorLod1Path = modelEditorLod1Path; + input.modelEditorLod2Path = modelEditorLod2Path; + input.modelEditorLodPreview = 0; root.setRight(buildModelEditorPanel(relPath, absolutePath, meta)); setStatus("Modell-Editor: " + relPath); @@ -4004,6 +4300,43 @@ public class EditorApp extends Application { addLabeledRow(rndGrid, 0, "Min:", rndMinSpin); addLabeledRow(rndGrid, 1, "Max:", rndMaxSpin); + // ── LOD ─────────────────────────────────────────────────────────────── + Label lodTitle = new Label("Level of Detail"); + lodTitle.setStyle("-fx-font-weight:bold; -fx-text-fill:#ccc;"); + + modelEditorLod1Label = new Label(modelEditorLod1Path.isBlank() ? "(nicht gesetzt)" : modelEditorLod1Path); + modelEditorLod1Label.setStyle("-fx-text-fill:#888; -fx-font-size:11;"); + modelEditorLod1Label.setWrapText(true); + Button lod1ImportBtn = new Button("LOD 1 importieren…"); + Button lod1ClearBtn = new Button("✕"); + lod1ClearBtn.setStyle("-fx-text-fill:#c0392b;"); + lod1ImportBtn.setMaxWidth(Double.MAX_VALUE); + lod1ImportBtn.setOnAction(e -> importLodFile(1)); + lod1ClearBtn.setOnAction(e -> { + modelEditorLod1Path = ""; + input.modelEditorLod1Path = ""; + modelEditorLod1Label.setText("(nicht gesetzt)"); + }); + + modelEditorLod2Label = new Label(modelEditorLod2Path.isBlank() ? "(nicht gesetzt)" : modelEditorLod2Path); + modelEditorLod2Label.setStyle("-fx-text-fill:#888; -fx-font-size:11;"); + modelEditorLod2Label.setWrapText(true); + Button lod2ImportBtn = new Button("LOD 2 importieren…"); + Button lod2ClearBtn = new Button("✕"); + lod2ClearBtn.setStyle("-fx-text-fill:#c0392b;"); + lod2ImportBtn.setMaxWidth(Double.MAX_VALUE); + lod2ImportBtn.setOnAction(e -> importLodFile(2)); + lod2ClearBtn.setOnAction(e -> { + modelEditorLod2Path = ""; + input.modelEditorLod2Path = ""; + modelEditorLod2Label.setText("(nicht gesetzt)"); + }); + + HBox lod1Row = new HBox(4, lod1ImportBtn, lod1ClearBtn); + HBox lod2Row = new HBox(4, lod2ImportBtn, lod2ClearBtn); + HBox.setHgrow(lod1ImportBtn, javafx.scene.layout.Priority.ALWAYS); + HBox.setHgrow(lod2ImportBtn, javafx.scene.layout.Priority.ALWAYS); + // ── Buttons ─────────────────────────────────────────────────────────── Button saveBtn = new Button("💾 Speichern"); saveBtn.setMaxWidth(Double.MAX_VALUE); @@ -4032,7 +4365,8 @@ public class EditorApp extends Application { castCB.isSelected(), receiveCB.isSelected(), (float)(double) rndMinSpin.getValue(), - (float)(double) rndMaxSpin.getValue())); + (float)(double) rndMaxSpin.getValue(), + modelEditorLod1Path, modelEditorLod2Path)); placeBtn.setOnAction(e -> { input.modelEditorCloseRequest = true; @@ -4065,6 +4399,10 @@ public class EditorApp extends Application { new Separator(), rndTitle, rndGrid, new Separator(), + lodTitle, + modelEditorLod1Label, lod1Row, + modelEditorLod2Label, lod2Row, + new Separator(), saveBtn, placeBtn, closeBtn ); return panel; @@ -4096,6 +4434,22 @@ public class EditorApp extends Application { return s; } + private Spinner buildDistSpinner(double initial) { + SpinnerValueFactory.DoubleSpinnerValueFactory f = + new SpinnerValueFactory.DoubleSpinnerValueFactory(1.0, 2000.0, initial, 5.0); + f.setConverter(new javafx.util.converter.DoubleStringConverter() { + @Override public Double fromString(String s) { + try { return Double.parseDouble(s.replace(',', '.')); } + catch (Exception ex) { return initial; } + } + }); + Spinner s = new Spinner<>(f); + s.setEditable(true); + s.setMaxWidth(Double.MAX_VALUE); + s.setStyle("-fx-background-color:#3a3a4e;"); + return s; + } + private void addLabeledRow(GridPane grid, int row, String labelText, javafx.scene.Node ctrl) { Label l = new Label(labelText); l.setStyle("-fx-text-fill:#aaa;"); @@ -4125,10 +4479,12 @@ public class EditorApp extends Application { float sx, float sy, float sz, boolean uniform, float pivotY, float placeY, boolean solid, boolean cast, boolean receive, - float rndMin, float rndMax) { + float rndMin, float rndMax, + String lod1Path, String lod2Path) { de.blight.common.ModelMeta meta = new de.blight.common.ModelMeta( name, category, tags, sx, sy, sz, uniform, - pivotY, placeY, solid, cast, receive, rndMin, rndMax); + pivotY, placeY, solid, cast, receive, rndMin, rndMax, + lod1Path, lod2Path, 30f, 80f, 120f); if (absolutePath == null || !absolutePath.toFile().exists()) { setStatus("Fehler: Modell-Datei nicht gefunden – Meta nicht gespeichert"); @@ -4181,6 +4537,35 @@ public class EditorApp extends Application { input.refreshAssets = true; } + private void importLodFile(int slot) { + FileChooser fc = new FileChooser(); + fc.setTitle("LOD " + slot + " – j3o wählen"); + fc.getExtensionFilters().add(new FileChooser.ExtensionFilter("JME3 Modell (*.j3o)", "*.j3o")); + File chosen = fc.showOpenDialog(primaryStage); + if (chosen == null) return; + java.nio.file.Path lodDir = ASSET_ROOT.resolve("Models").resolve("lods"); + try { + java.nio.file.Files.createDirectories(lodDir); + java.nio.file.Path dest = lodDir.resolve(chosen.getName()); + java.nio.file.Files.copy(chosen.toPath(), dest, java.nio.file.StandardCopyOption.REPLACE_EXISTING); + String relPath = ASSET_ROOT.relativize(dest).toString().replace('\\', '/'); + if (slot == 1) { + modelEditorLod1Path = relPath; + input.modelEditorLod1Path = relPath; + if (modelEditorLod1Label != null) modelEditorLod1Label.setText(relPath); + } else { + modelEditorLod2Path = relPath; + input.modelEditorLod2Path = relPath; + if (modelEditorLod2Label != null) modelEditorLod2Label.setText(relPath); + } + setStatus("LOD " + slot + " importiert: " + relPath); + boolean pe = shouldPreserveExpansion(); + refreshCategoryNode(modelsNode, pe); + } catch (java.io.IOException ex) { + setStatus("Import fehlgeschlagen: " + ex.getMessage()); + } + } + // ── Zentraler Bereich: JME3-Viewport ──────────────────────────────────── private StackPane buildViewport() { @@ -4252,6 +4637,17 @@ public class EditorApp extends Application { return; } + if (input.activeLayer == SharedInput.LAYER_ITEMS) { + if (e.getButton() == MouseButton.PRIMARY && !bothDown) { + input.itemClickQueue.offer( + new SharedInput.ObjectClick((float)e.getX(), (float)e.getY(), false, false)); + } else if (e.getButton() == MouseButton.SECONDARY) { + input.itemClickQueue.offer( + new SharedInput.ObjectClick((float)e.getX(), (float)e.getY(), true, false)); + } + return; + } + if (bothDown) { stopEditTimer(); } else if (e.getButton() == MouseButton.PRIMARY) { @@ -4382,6 +4778,10 @@ public class EditorApp extends Application { private void launchGame() { if (launchGameAfterSave) return; // bereits ausstehend launchGameAfterSave = true; + if (gamePlayBtn != null) { + gamePlayBtn.setDisable(true); + gamePlayBtn.setText("⏳ Startet…"); + } input.saveRequested = true; setStatus("Karte wird gespeichert, Spiel startet…"); } @@ -4415,6 +4815,7 @@ public class EditorApp extends Application { Platform.runLater(() -> { setStatus("Spiel gestartet"); + if (gamePlayBtn != null) gamePlayBtn.setText("🎮 Läuft…"); openGameConsole(); }); @@ -4428,12 +4829,24 @@ public class EditorApp extends Application { Platform.runLater(() -> appendToConsole(l)); } } - // Spiel beendet → Live-Position löschen + // Spiel beendet → Live-Position löschen, Button freigeben input.livePlayerX = Float.NaN; - Platform.runLater(() -> appendToConsole("--- Spiel beendet ---")); + Platform.runLater(() -> { + appendToConsole("--- Spiel beendet ---"); + if (gamePlayBtn != null) { + gamePlayBtn.setText("▶ Spielen"); + gamePlayBtn.setDisable(false); + } + }); } catch (IOException ex) { - Platform.runLater(() -> setStatus("Spielstart fehlgeschlagen: " + ex.getMessage())); + Platform.runLater(() -> { + setStatus("Spielstart fehlgeschlagen: " + ex.getMessage()); + if (gamePlayBtn != null) { + gamePlayBtn.setText("▶ Spielen"); + gamePlayBtn.setDisable(false); + } + }); } }, "game-launcher").start(); } @@ -4999,6 +5412,7 @@ public class EditorApp extends Application { inner.getChildren().addAll(coordRow, clearSpawn, new Separator()); Button playBtn = new Button("▶ Spielen"); + gamePlayBtn = playBtn; playBtn.setMaxWidth(Double.MAX_VALUE); playBtn.setStyle( "-fx-background-color: #2d8a3e; -fx-text-fill: white; " + @@ -5314,6 +5728,382 @@ public class EditorApp extends Application { root.setRight(buildAnimPreviewPanel()); } + // ── AnimSet-Editor ──────────────────────────────────────────────────────── + + private void openAnimSetEditor(String relPath, Path absPath) { + String setName = absPath.getFileName().toString().replaceFirst("\\.animset\\.json$", ""); + Path setDir = absPath.getParent(); + + de.blight.game.animation.AnimSet animSet; + try { + animSet = de.blight.game.animation.AnimSet.load(setDir, setName); + } catch (Exception ex) { + animSet = new de.blight.game.animation.AnimSet(); + setStatus("Fehler beim Laden: " + ex.getMessage()); + } + + animSetCurrentName = setName; + animSetCurrentDir = setDir; + animSetDirty = false; + currentTool = "animseteditor"; + topBar.getChildren().set(1, buildAnimSetToolBar(setName)); + + animPreviewView = new ImageView(input.animPreviewImage); + animPreviewView.setPreserveRatio(true); + animPreviewView.setSmooth(true); + StackPane previewPane = new StackPane(animPreviewView); + previewPane.setStyle("-fx-background-color: #2e2e38;"); + previewPane.widthProperty().addListener((obs, ov, nv) -> { + animPreviewView.setFitWidth(nv.doubleValue()); + input.animPreviewW = Math.max(64, nv.intValue()); + }); + previewPane.heightProperty().addListener((obs, ov, nv) -> { + animPreviewView.setFitHeight(nv.doubleValue()); + input.animPreviewH = Math.max(64, nv.intValue()); + }); + previewPane.setOnMousePressed(e -> { animPrevDragX = e.getSceneX(); animPrevDragY = e.getSceneY(); }); + previewPane.setOnMouseDragged(e -> { + double dx = e.getSceneX() - animPrevDragX, dy = e.getSceneY() - animPrevDragY; + animPrevDragX = e.getSceneX(); animPrevDragY = e.getSceneY(); + input.animPreviewRotY += (float)(dx * 0.5); + input.animPreviewRotX = (float) Math.max(-80, Math.min(80, input.animPreviewRotX - dy * 0.3)); + }); + previewPane.setOnScroll(e -> { + double factor = e.getDeltaY() > 0 ? 0.9 : 1.1; + input.animPreviewZoom = (float) Math.max(0.05, Math.min(20.0, input.animPreviewZoom * factor)); + }); + + root.setCenter(previewPane); + root.setRight(buildAnimSetPanel(setName, setDir, animSet)); + setStatus("AnimSet-Editor: " + setName); + } + + private ToolBar buildAnimSetToolBar(String setName) { + Button backBtn = new Button("← Welteneditor"); + backBtn.setOnAction(e -> switchToWorldEditor()); + Label label = new Label("AnimSet: " + setName); + label.setStyle("-fx-font-weight: bold; -fx-font-size: 13;"); + Button newSetBtn = new Button("➕ Neues Set…"); + newSetBtn.setOnAction(e -> createNewAnimSet()); + ToolBar tb = new ToolBar(); + tb.getItems().addAll(backBtn, new Separator(Orientation.VERTICAL), label, + new Separator(Orientation.VERTICAL), newSetBtn); + return tb; + } + + private VBox buildAnimSetPanel(String setName, Path setDir, + de.blight.game.animation.AnimSet animSet) { + VBox inner = new VBox(8); + inner.setPadding(new Insets(10)); + + // ── Modell-Auswahl für Vorschau ─────────────────────────────────────── + inner.getChildren().addAll(sectionTitle("Charakter-Modell"), new Separator()); + animSetModelCombo = new ComboBox<>(); + animSetModelCombo.setMaxWidth(Double.MAX_VALUE); + animSetModelCombo.setPromptText("j3o-Datei wählen…"); + for (String dir : new String[]{"Models", "animations"}) { + Path base = ASSET_ROOT.resolve(dir); + if (!java.nio.file.Files.isDirectory(base)) continue; + try (var walk = java.nio.file.Files.walk(base)) { + walk.filter(p -> p.toString().endsWith(".j3o")) + .map(p -> ASSET_ROOT.relativize(p).toString().replace('\\', '/')) + .sorted() + .forEach(animSetModelCombo.getItems()::add); + } catch (IOException ignored) {} + } + Button loadModelBtn = new Button("Laden"); + loadModelBtn.setMaxWidth(Double.MAX_VALUE); + loadModelBtn.setOnAction(e -> { + String path = animSetModelCombo.getValue(); + if (path == null || path.isBlank()) return; + input.animPreviewLoadPath = path; + if (animPreviewStatusLabel != null) animPreviewStatusLabel.setText("Lade…"); + }); + inner.getChildren().addAll(animSetModelCombo, loadModelBtn); + + // ── Clips im Set ───────────────────────────────────────────────────── + inner.getChildren().addAll(new Separator(), sectionTitle("Clips im Set"), new Separator()); + + animSetClipListView = new ListView<>(); + animSetClipListView.getItems().addAll(animSet.getClips()); + animSetClipListView.setPrefHeight(180); + + // alle verfügbaren Clips aus animations/clips/ (unabhängig ob bereits im Set) + java.util.List availableClips = new java.util.ArrayList<>(); + Path clipsDir = ASSET_ROOT.resolve("animations").resolve("clips"); + if (java.nio.file.Files.isDirectory(clipsDir)) { + try (var walk = java.nio.file.Files.walk(clipsDir, 1)) { + walk.filter(cp -> cp.toString().endsWith(".j3o")) + .map(cp -> cp.getFileName().toString().replaceFirst("\\.j3o$", "")) + .sorted() + .forEach(availableClips::add); + } catch (IOException ignored) {} + } + + Button addClipBtn = new Button("+ Hinzufügen…"); + Button removeClipBtn = new Button("- Entfernen"); + addClipBtn.setMaxWidth(Double.MAX_VALUE); + removeClipBtn.setMaxWidth(Double.MAX_VALUE); + removeClipBtn.setDisable(true); + + animSetClipListView.getSelectionModel().selectedItemProperty() + .addListener((obs, ov, nv) -> removeClipBtn.setDisable(nv == null)); + + addClipBtn.setOnAction(e -> { + ComboBox combo = new ComboBox<>(); + // alle verfügbaren Clips anzeigen, nicht nur unbenutzte + combo.getItems().addAll(availableClips); + combo.setEditable(true); + combo.setMaxWidth(Double.MAX_VALUE); + combo.getSelectionModel().selectFirst(); + + javafx.scene.control.Dialog dlg = new javafx.scene.control.Dialog<>(); + dlg.setTitle("Clip hinzufügen"); + dlg.setHeaderText("Clip aus animations/clips/ wählen:"); + dlg.getDialogPane().setContent(combo); + javafx.scene.control.ButtonType ok = new javafx.scene.control.ButtonType("Hinzufügen", + javafx.scene.control.ButtonBar.ButtonData.OK_DONE); + dlg.getDialogPane().getButtonTypes().addAll(ok, javafx.scene.control.ButtonType.CANCEL); + dlg.setResultConverter(bt -> bt == ok ? combo.getValue() : null); + dlg.showAndWait().ifPresent(clip -> { + if (clip != null && !clip.isBlank() + && !animSetClipListView.getItems().contains(clip)) { + animSetClipListView.getItems().add(clip); + animSetDirty = true; + } + }); + }); + + removeClipBtn.setOnAction(e -> { + String sel = animSetClipListView.getSelectionModel().getSelectedItem(); + if (sel == null) return; + animSetClipListView.getItems().remove(sel); + if (animSetActionListView != null) + animSetActionListView.getItems().removeIf(it -> it.endsWith(" → " + sel)); + animSetDirty = true; + }); + + HBox clipBtns = new HBox(6, addClipBtn, removeClipBtn); + HBox.setHgrow(addClipBtn, Priority.ALWAYS); + HBox.setHgrow(removeClipBtn, Priority.ALWAYS); + inner.getChildren().addAll(animSetClipListView, clipBtns); + + // ── Aktions-Zuordnung ───────────────────────────────────────────────── + inner.getChildren().addAll(new Separator(), sectionTitle("Aktions-Zuordnung"), new Separator()); + + animSetActionListView = new ListView<>(); + animSetActionListView.setPrefHeight(160); + for (var entry : animSet.getActionMap().entrySet()) + animSetActionListView.getItems().add(entry.getKey() + " → " + entry.getValue()); + + Button addActionBtn = new Button("+ Zuordnen…"); + Button removeActionBtn = new Button("- Entfernen"); + addActionBtn.setMaxWidth(Double.MAX_VALUE); + removeActionBtn.setMaxWidth(Double.MAX_VALUE); + removeActionBtn.setDisable(true); + + animSetActionListView.getSelectionModel().selectedItemProperty() + .addListener((obs, ov, nv) -> removeActionBtn.setDisable(nv == null)); + + addActionBtn.setOnAction(e -> showAddActionToSetDialog()); + removeActionBtn.setOnAction(e -> { + String sel = animSetActionListView.getSelectionModel().getSelectedItem(); + if (sel != null) { + animSetActionListView.getItems().remove(sel); + animSetDirty = true; + } + }); + + HBox actionBtns = new HBox(6, addActionBtn, removeActionBtn); + HBox.setHgrow(addActionBtn, Priority.ALWAYS); + HBox.setHgrow(removeActionBtn, Priority.ALWAYS); + inner.getChildren().addAll(animSetActionListView, actionBtns); + + // ── Vorschau ───────────────────────────────────────────────────────── + inner.getChildren().addAll(new Separator(), sectionTitle("Vorschau"), new Separator()); + + Label previewHint = new Label("Clip auswählen → Abspielen (oder Doppelklick)"); + previewHint.setStyle("-fx-font-size: 10; -fx-text-fill: #888;"); + previewHint.setWrapText(true); + + Button playBtn = new Button("▶ Abspielen"); + Button stopBtn = new Button("■ Stop"); + playBtn.setMaxWidth(Double.MAX_VALUE); + stopBtn.setMaxWidth(Double.MAX_VALUE); + + animSetClipListView.setOnMouseClicked(e -> { + if (e.getClickCount() == 2) previewSelectedClip(); + }); + playBtn.setOnAction(e -> previewSelectedClip()); + stopBtn.setOnAction(e -> input.animPreviewPlayClip = ""); + + HBox previewBtns = new HBox(6, playBtn, stopBtn); + HBox.setHgrow(playBtn, Priority.ALWAYS); + HBox.setHgrow(stopBtn, Priority.ALWAYS); + + CheckBox loopCB = new CheckBox("Loop"); + loopCB.setSelected(true); + loopCB.setOnAction(ev -> input.animPreviewLoop = loopCB.isSelected()); + + Slider speedSlider = new Slider(0.1, 3.0, 1.0); + speedSlider.setShowTickMarks(true); + speedSlider.setShowTickLabels(true); + speedSlider.setMajorTickUnit(1.0); + speedSlider.valueProperty().addListener((obs, ov, nv) -> input.animPreviewSpeed = nv.floatValue()); + + animPreviewStatusLabel = new Label("Kein Modell geladen"); + animPreviewStatusLabel.setWrapText(true); + animPreviewStatusLabel.setStyle("-fx-font-size: 11; -fx-text-fill: #555;"); + + inner.getChildren().addAll(previewHint, previewBtns, loopCB, + new Label("Tempo:"), speedSlider, animPreviewStatusLabel); + + // ── Speichern ───────────────────────────────────────────────────────── + inner.getChildren().add(new Separator()); + Button saveBtn = new Button("💾 Speichern"); + saveBtn.setMaxWidth(Double.MAX_VALUE); + saveBtn.setStyle("-fx-background-color:#2e7d32; -fx-text-fill:#fff; -fx-font-weight:bold;"); + saveBtn.setOnAction(e -> saveCurrentAnimSet(setName, setDir)); + inner.getChildren().add(saveBtn); + + ScrollPane scroll = new ScrollPane(inner); + scroll.setFitToWidth(true); + scroll.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); + scroll.setStyle("-fx-background-color: transparent; -fx-background: transparent;"); + VBox panel = new VBox(scroll); + VBox.setVgrow(scroll, Priority.ALWAYS); + panel.setPrefWidth(270); + panel.setStyle("-fx-background-color: #f0f0f0; -fx-border-color: #ccc; -fx-border-width: 0 0 0 1;"); + return panel; + } + + private void previewSelectedClip() { + if (animSetClipListView == null) return; + String clip = animSetClipListView.getSelectionModel().getSelectedItem(); + if (clip == null) return; + animSetPendingPlayClip = clip; + input.animPreviewLoadPath = "animations/clips/" + clip + ".j3o"; + if (animPreviewStatusLabel != null) animPreviewStatusLabel.setText("Lade " + clip + "…"); + } + + private void showAddActionToSetDialog() { + if (animSetClipListView == null || animSetClipListView.getItems().isEmpty()) { + setStatus("Keine Clips im Set — erst Clips hinzufügen."); + return; + } + java.util.Set usedActions = new java.util.HashSet<>(); + if (animSetActionListView != null) + for (String it : animSetActionListView.getItems()) + usedActions.add(it.split(" → ")[0]); + + java.util.List available = + java.util.Arrays.stream(de.blight.game.animation.AnimationAction.values()) + .filter(a -> !usedActions.contains(a.name())) + .collect(java.util.stream.Collectors.toList()); + if (available.isEmpty()) { setStatus("Alle Aktionen bereits zugeordnet."); return; } + + ComboBox actionCombo = new ComboBox<>(); + actionCombo.getItems().addAll(available); + javafx.util.Callback, + javafx.scene.control.ListCell> cf = + lv -> new javafx.scene.control.ListCell<>() { + @Override protected void updateItem(de.blight.game.animation.AnimationAction it, + boolean empty) { + super.updateItem(it, empty); + setText(empty || it == null ? null : it.displayName() + " (" + it.name() + ")"); + } + }; + actionCombo.setCellFactory(cf); + actionCombo.setButtonCell(cf.call(null)); + actionCombo.setMaxWidth(Double.MAX_VALUE); + actionCombo.getSelectionModel().selectFirst(); + + ComboBox clipCombo = new ComboBox<>(); + clipCombo.getItems().addAll(animSetClipListView.getItems()); + clipCombo.setMaxWidth(Double.MAX_VALUE); + clipCombo.getSelectionModel().selectFirst(); + + javafx.scene.layout.GridPane grid = new javafx.scene.layout.GridPane(); + grid.setHgap(8); grid.setVgap(6); + grid.add(new Label("Aktion:"), 0, 0); grid.add(actionCombo, 1, 0); + grid.add(new Label("Clip:"), 0, 1); grid.add(clipCombo, 1, 1); + javafx.scene.layout.ColumnConstraints cc = new javafx.scene.layout.ColumnConstraints(); + cc.setHgrow(Priority.ALWAYS); + grid.getColumnConstraints().addAll(new javafx.scene.layout.ColumnConstraints(), cc); + + javafx.scene.control.Dialog dlg = + new javafx.scene.control.Dialog<>(); + dlg.setTitle("Aktion zuordnen"); + javafx.scene.control.ButtonType ok = new javafx.scene.control.ButtonType("Hinzufügen", + javafx.scene.control.ButtonBar.ButtonData.OK_DONE); + dlg.getDialogPane().getButtonTypes().addAll(ok, javafx.scene.control.ButtonType.CANCEL); + dlg.getDialogPane().setContent(grid); + dlg.showAndWait().ifPresent(bt -> { + if (bt != ok) return; + var action = actionCombo.getValue(); + var clip = clipCombo.getValue(); + if (action != null && clip != null) { + String entry = action.name() + " → " + clip; + if (!animSetActionListView.getItems().contains(entry)) + animSetActionListView.getItems().add(entry); + } + }); + } + + private void saveCurrentAnimSet(String setName, Path setDir) { + if (animSetClipListView == null) return; + de.blight.game.animation.AnimSet animSet = new de.blight.game.animation.AnimSet(); + animSet.setClips(new java.util.ArrayList<>(animSetClipListView.getItems())); + java.util.Map actionMap = new java.util.LinkedHashMap<>(); + if (animSetActionListView != null) + for (String it : animSetActionListView.getItems()) { + String[] parts = it.split(" → ", 2); + if (parts.length == 2) actionMap.put(parts[0], parts[1]); + } + animSet.setActionMap(actionMap); + try { + animSet.save(setDir, setName); + setStatus("AnimSet gespeichert: " + setName + ".animset.json"); + input.refreshAssets = true; + } catch (IOException ex) { + setStatus("Fehler beim Speichern: " + ex.getMessage()); + } + } + + private void createNewAnimSet() { + if (animSetDirty) { + Alert warn = new Alert(Alert.AlertType.CONFIRMATION, + "Das aktuelle AnimSet hat ungespeicherte Änderungen.\nTrotzdem ein neues Set anlegen?", + ButtonType.OK, ButtonType.CANCEL); + warn.setHeaderText("Ungespeicherte Änderungen"); + warn.showAndWait().filter(b -> b == ButtonType.OK).ifPresent(b -> doCreateNewAnimSet()); + } else { + doCreateNewAnimSet(); + } + } + + private void doCreateNewAnimSet() { + TextInputDialog dlg = new TextInputDialog(); + dlg.setTitle("Neues Animations-Set"); + dlg.setHeaderText("Name des neuen Animations-Sets:"); + dlg.setContentText("Name:"); + dlg.showAndWait().ifPresent(raw -> { + String name = raw.trim(); + if (name.isBlank()) return; + Path setDir = ASSET_ROOT.resolve("animations").resolve("sets"); + Path setFile = setDir.resolve(name + ".animset.json"); + try { + Files.createDirectories(setDir); + new de.blight.game.animation.AnimSet().save(setDir, name); + refreshCategoryNode(animationsNode, shouldPreserveExpansion()); + String relPath = ASSET_ROOT.relativize(setFile).toString().replace('\\', '/'); + openAnimSetEditor(relPath, setFile); + } catch (IOException ex) { + setStatus("Fehler beim Anlegen: " + ex.getMessage()); + } + }); + } + private ToolBar buildAnimPreviewToolBar() { Button backBtn = new Button("← Welteneditor"); backBtn.setOnAction(e -> switchToWorldEditor()); @@ -5508,7 +6298,7 @@ public class EditorApp extends Application { if (files == null) return; for (File file : files) { try { - Path destDir = ASSET_ROOT.resolve("animations"); + Path destDir = ASSET_ROOT.resolve("animations").resolve("clips"); Files.createDirectories(destDir); Path destFile = destDir.resolve(file.getName()); Files.copy(file.toPath(), destFile, java.nio.file.StandardCopyOption.REPLACE_EXISTING); @@ -5518,7 +6308,7 @@ public class EditorApp extends Application { } } // Sofort im JavaFX-Thread aktualisieren – keine Konvertierung nötig - refreshCategoryNode(animationsNode); + refreshCategoryNode(animationsNode, shouldPreserveExpansion()); refreshAddAnimCombo(addAnimComboField); } diff --git a/blight-editor/src/main/java/de/blight/editor/JmeEditorApp.java b/blight-editor/src/main/java/de/blight/editor/JmeEditorApp.java index 22d62ec..1b30b78 100644 --- a/blight-editor/src/main/java/de/blight/editor/JmeEditorApp.java +++ b/blight-editor/src/main/java/de/blight/editor/JmeEditorApp.java @@ -8,6 +8,7 @@ import com.jme3.texture.FrameBuffer; import com.jme3.texture.Image; import com.jme3.texture.Texture2D; import de.blight.editor.state.AnimPreviewState; +import de.blight.editor.state.ItemPlacementState; import de.blight.editor.state.AreaState; import de.blight.editor.state.ModelEditorState; import de.blight.editor.state.EmitterState; @@ -18,6 +19,7 @@ import de.blight.editor.state.SoundAreaState; import de.blight.editor.state.WaterBodyState; import de.blight.editor.state.EzTreeState; import de.blight.editor.state.LightState; +import de.blight.editor.state.FernGeneratorState; import de.blight.editor.state.PalmGeneratorState; import de.blight.editor.state.SceneObjectState; import de.blight.editor.state.TerrainEditorState; @@ -91,6 +93,7 @@ public class JmeEditorApp extends SimpleApplication { stateManager.attach(new TreeGeneratorState(input)); stateManager.attach(new EzTreeState(input)); stateManager.attach(new PalmGeneratorState(input)); + stateManager.attach(new FernGeneratorState(input)); stateManager.attach(new LightState(input)); stateManager.attach(new EmitterState(input)); stateManager.attach(new WaterBodyState(input)); @@ -101,6 +104,7 @@ public class JmeEditorApp extends SimpleApplication { stateManager.attach(new PlayToolState(input)); stateManager.attach(new AnimPreviewState(input)); stateManager.attach(new ModelEditorState(input)); + stateManager.attach(new ItemPlacementState(input)); input.loadingStatus = "Initialisiere Konsole..."; jmeConsole = new JmeConsole(false); diff --git a/blight-editor/src/main/java/de/blight/editor/SharedInput.java b/blight-editor/src/main/java/de/blight/editor/SharedInput.java index 63f0b61..800da04 100644 --- a/blight-editor/src/main/java/de/blight/editor/SharedInput.java +++ b/blight-editor/src/main/java/de/blight/editor/SharedInput.java @@ -76,6 +76,10 @@ public class SharedInput { public record GrassVertexEdit(float screenX, float screenY, int action) {} public final ConcurrentLinkedQueue grassVertexEditQueue = new ConcurrentLinkedQueue<>(); + // ── Farn-Generator ──────────────────────────────────────────────────────── + public record FernGenRequest(de.blight.editor.tree.FernOptions options, boolean exportAfter) {} + public final ConcurrentLinkedQueue fernGenQueue = new ConcurrentLinkedQueue<>(); + // ── Gras-Einstellungen (JavaFX → JME3) ─────────────────────────────────── /** Relativer Asset-Pfad der Gras-Textur ("" = Standardfarbe). */ public volatile String grassTexturePath = ""; @@ -582,4 +586,23 @@ public class SharedInput { /** JFX → JME: Model-Editor schließen. */ public volatile boolean modelEditorCloseRequest = false; + + /** JME → JFX: true wenn das geladene Modell eingebettete LOD-Kinder hat (kein separater Pfad nötig). */ + public volatile boolean modelEditorHasEmbeddedLods = false; + + /** JFX → JME: welche LOD-Stufe anzeigen (0=LOD0, 1=LOD1, 2=LOD2). */ + public volatile int modelEditorLodPreview = 0; + public volatile String modelEditorLod1Path = ""; + public volatile String modelEditorLod2Path = ""; + public volatile boolean modelEditorLodChanged = false; + + // ── Item-Platzierung ────────────────────────────────────────────────────── + /** activeLayer==21 → Item-Pickup auf die Karte platzieren */ + public static final int LAYER_ITEMS = 21; + + /** JFX → JME: itemId des zu platzierenden Items (aus .item-Datei). */ + public volatile String pendingItemId = null; + + /** Klick-Events für Item-Platzierung (analoges Format zu objectClickQueue). */ + public final ConcurrentLinkedQueue itemClickQueue = new ConcurrentLinkedQueue<>(); } diff --git a/blight-editor/src/main/java/de/blight/editor/object/SceneObject.java b/blight-editor/src/main/java/de/blight/editor/object/SceneObject.java index 08f355e..0057883 100644 --- a/blight-editor/src/main/java/de/blight/editor/object/SceneObject.java +++ b/blight-editor/src/main/java/de/blight/editor/object/SceneObject.java @@ -19,6 +19,11 @@ public class SceneObject extends PlacedObject { public String texturePath = ""; public String normalMapPath = ""; public String materialPath = ""; + public String lod1Path = ""; + public String lod2Path = ""; + public float lod1Distance = 30f; + public float lod2Distance = 80f; + public float cullDistance = 120f; public SceneObject(String modelPath, float worldX, float worldZ, float groundY, boolean solid) { diff --git a/blight-editor/src/main/java/de/blight/editor/state/EzTreeState.java b/blight-editor/src/main/java/de/blight/editor/state/EzTreeState.java index 754836d..7328e7a 100644 --- a/blight-editor/src/main/java/de/blight/editor/state/EzTreeState.java +++ b/blight-editor/src/main/java/de/blight/editor/state/EzTreeState.java @@ -61,6 +61,9 @@ public class EzTreeState extends BaseAppState { private static final Logger log = LoggerFactory.getLogger(EzTreeState.class); private static final int IMPOSTOR_SIZE = 512; + private static final int ATLAS_DIRS = 4; + private static final int ATLAS_W = IMPOSTOR_SIZE * ATLAS_DIRS; + private static final int ATLAS_H = IMPOSTOR_SIZE; private static final Path ASSET_ROOT = de.blight.editor.ProjectRoot.resolve("blight-assets", "src", "main", "resources"); private static final Path TOOLS_DIR = de.blight.editor.ProjectRoot.resolve("tools"); private static final Gson GSON = new Gson(); @@ -72,10 +75,14 @@ public class EzTreeState extends BaseAppState { // ── Capture-Phase ──────────────────────────────────────────────────────── private SharedInput.EzTreeGenRequest pendingRequest = null; - private Node pendingTreeNode = null; + private Node pendingHdNode = null; + private Node pendingLd1Node = null; + private BoundingBox pendingBb = null; private ViewPort captureVP = null; private FrameBuffer captureFB = null; private volatile boolean captureReady = false; + private int capturePass = 0; + private ByteBuffer[] capturePixels = new ByteBuffer[ATLAS_DIRS]; public EzTreeState(SharedInput input) { this.input = input; } @@ -113,14 +120,15 @@ public class EzTreeState extends BaseAppState { private void startGeneration(SharedInput.EzTreeGenRequest req) { cleanupCapture(); - Node treeNode = tryNodeJsGeneration(req); - if (treeNode == null) { - treeNode = javaFallback(req); - } - final Node finalNode = treeNode; - finalNode.updateGeometricState(); + Node hdNode = tryNodeJsGeneration(req); + if (hdNode == null) hdNode = javaFallback(req); + hdNode.setLocalScale(1f / 3f); + hdNode.updateGeometricState(); - BoundingBox bb = boundsOf(finalNode); + Node ld1Node = buildLod1Node(req.options()); + ld1Node.setLocalScale(1f / 3f); + + BoundingBox bb = boundsOf(hdNode); float camDist = bb != null ? Math.max(bb.getXExtent(), Math.max(bb.getYExtent(), bb.getZExtent())) * 3.2f : 20f; @@ -128,22 +136,45 @@ public class EzTreeState extends BaseAppState { ? new Vector3f(0f, bb.getCenter().y, 0f) : new Vector3f(0f, 5f, 0f); + final Node finalHd = hdNode; + final Node finalLd1 = ld1Node; + final BoundingBox finalBb = bb; final float dist = camDist; final Vector3f tgt = target; app.enqueue(() -> { - previewHost.setPreviewContent(finalNode, dist, tgt); + previewHost.setPreviewContent(finalHd, dist, tgt); if (req.exportAfter()) { - setupCapture(finalNode, boundsOf(finalNode), req); + pendingRequest = req; + pendingHdNode = finalHd; + pendingLd1Node = finalLd1; + pendingBb = finalBb; + capturePass = 0; + capturePixels = new ByteBuffer[ATLAS_DIRS]; + startCapturePass(0, finalHd, finalBb); + input.treeGenStatusMsg = "EZ-Tree: rendere Impostor (1/" + ATLAS_DIRS + ")…"; } }); if (!req.exportAfter()) { input.treeGenStatusMsg = "EZ-Tree Vorschau: " + resolveSubPath(req.presetName()); - } else { - input.treeGenStatusMsg = "EZ-Tree: generiere…"; } } + private Node buildLod1Node(TreeOptions opts) { + TreeOptions ld = opts.copy(); + // Levels NICHT reduzieren – gleiche Baumform und -größe wie LOD0 behalten. + // Nur Polygon-Anzahl pro Ast halbieren (sections/segments) und Blattanzahl reduzieren. + for (int lv = 0; lv <= ld.branch.levels; lv++) { + ld.branch.sections.put(lv, Math.max(3, opts.branch.getSections(lv) / 2)); + ld.branch.segments.put(lv, Math.max(3, opts.branch.getSegments(lv) / 2)); + } + ld.leaves.count = Math.max(0, opts.leaves.count / 2); + Tree tree = new Tree(ld); + tree.generate(); + applyMaterials(tree, opts); + return treeToNode(tree, "EzTree_ld1"); + } + // ── Node.js-Generierung ─────────────────────────────────────────────────── private Node tryNodeJsGeneration(SharedInput.EzTreeGenRequest req) { @@ -328,45 +359,71 @@ public class EzTreeState extends BaseAppState { Tree tree = new Tree(req.options()); tree.generate(); applyMaterials(tree, req.options()); - return tree; + return treeToNode(tree, "EzTree"); } - // ── Phase 2: Impostor-Capture ───────────────────────────────────────────── + /** Überträgt alle Kinder eines Tree in einen plain Node, damit kein Tree-Objekt im j3o landet. */ + private static Node treeToNode(Tree tree, String name) { + Node n = new Node(name); + n.setLocalScale(tree.getLocalScale()); + n.setLocalTranslation(tree.getLocalTranslation()); + for (Spatial child : new java.util.ArrayList<>(tree.getChildren())) { + tree.detachChild(child); + n.attachChild(child); + } + return n; + } - private void setupCapture(Node treeNode, BoundingBox bb, SharedInput.EzTreeGenRequest req) { + // ── Phase 2: Impostor-Capture (4-Richtungen) ───────────────────────────── + + private void startCapturePass(int pass, Node treeNode, BoundingBox bb) { BoundingBox safeBb = bb != null ? bb : new BoundingBox(Vector3f.ZERO, 5f, 10f, 5f); - Texture2D capTex = new Texture2D(IMPOSTOR_SIZE, IMPOSTOR_SIZE, Image.Format.RGBA8); captureFB = new FrameBuffer(IMPOSTOR_SIZE, IMPOSTOR_SIZE, 1); captureFB.addColorTexture(capTex); captureFB.setDepthTexture(new Texture2D(IMPOSTOR_SIZE, IMPOSTOR_SIZE, Image.Format.Depth)); - - captureVP = buildCaptureViewPort(treeNode, safeBb, captureFB); + float angle = pass * com.jme3.math.FastMath.HALF_PI; + captureVP = buildCaptureViewPort(treeNode, safeBb, captureFB, angle); captureReady = false; - pendingRequest = req; - pendingTreeNode = treeNode; - input.treeGenStatusMsg = "EZ-Tree: rendere Impostor…"; } private void finishCapture() { ByteBuffer pixels = BufferUtils.createByteBuffer(IMPOSTOR_SIZE * IMPOSTOR_SIZE * 4); app.getRenderer().readFrameBuffer(captureFB, pixels); - - SharedInput.EzTreeGenRequest req = pendingRequest; - Node treeNode = pendingTreeNode; + capturePixels[capturePass] = pixels; cleanupCapture(); + if (capturePass < ATLAS_DIRS - 1) { + capturePass++; + input.treeGenStatusMsg = "EZ-Tree: rendere Impostor (" + (capturePass + 1) + "/" + ATLAS_DIRS + ")…"; + startCapturePass(capturePass, pendingHdNode, pendingBb); + return; + } + + // Alle Richtungen erfasst + SharedInput.EzTreeGenRequest req = pendingRequest; + Node hdNode = pendingHdNode; + Node ld1Node = pendingLd1Node; + BoundingBox bb = pendingBb; + ByteBuffer[] savedPixels = capturePixels; + pendingRequest = null; + pendingHdNode = null; + pendingLd1Node = null; + pendingBb = null; + capturePixels = new ByteBuffer[ATLAS_DIRS]; + String subPath = resolveSubPath(req.presetName()); String namePart = req.presetName() != null ? req.presetName().toLowerCase().replace(" ", "_") : subPath; String timestamp = DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss").format(LocalDateTime.now()); String exportName = namePart + "_" + timestamp; - saveImpostor(pixels, "ez_impostor_" + exportName); - exportTree(treeNode, exportName, subPath); - pendingRequest = null; - pendingTreeNode = null; + ByteBuffer atlas = combineAtlas(savedPixels); + Texture2D atlasT2d = saveImpostor(atlas, "ez_impostor_" + exportName, ATLAS_W, ATLAS_H); + + Node lodRoot = assembleLodNode(req.presetName(), hdNode, ld1Node, bb, atlasT2d); + exportTree(lodRoot, exportName, subPath); } // ── Material-Aufbau ─────────────────────────────────────────────────────── @@ -440,15 +497,22 @@ public class EzTreeState extends BaseAppState { // ── Offscreen-Viewport für Impostor ─────────────────────────────────────── - private ViewPort buildCaptureViewPort(Node src, BoundingBox bb, FrameBuffer fb) { - Vector3f center = bb.getCenter().add(0f, 2f, 0f); - float extent = Math.max(bb.getXExtent(), Math.max(bb.getYExtent(), bb.getZExtent())); - float dist = extent * 3f; + private ViewPort buildCaptureViewPort(Node src, BoundingBox bb, FrameBuffer fb, float angle) { + Vector3f center = bb.getCenter(); + float yExt = bb.getYExtent(); + float hExt = Math.max(bb.getXExtent(), bb.getZExtent()); + float extent = Math.max(yExt, hExt); + float dist = extent * 3.5f; + float camX = com.jme3.math.FastMath.sin(angle) * dist; + float camZ = com.jme3.math.FastMath.cos(angle) * dist; Camera cam = new Camera(IMPOSTOR_SIZE, IMPOSTOR_SIZE); - cam.setLocation(center.add(0f, 0f, dist)); + cam.setLocation(center.add(camX, 0f, camZ)); cam.lookAt(center, Vector3f.UNIT_Y); - cam.setFrustumPerspective(35f, 1f, 0.1f, dist * 4f); + // FOV groß genug, um den vollen Baum (+ 15 % Rand) zu erfassen + float fovY = (float) Math.toDegrees(2.0 * Math.atan2(yExt * 1.15, dist)); + float fovH = (float) Math.toDegrees(2.0 * Math.atan2(hExt * 1.15, dist)); + cam.setFrustumPerspective(Math.max(fovY, fovH), 1f, 0.1f, dist * 4f); ViewPort vp = app.getRenderManager() .createPostView("ezCapture_" + System.nanoTime(), cam); @@ -524,34 +588,123 @@ public class EzTreeState extends BaseAppState { captureReady = false; } - private void saveImpostor(ByteBuffer pixels, String name) { + private Texture2D saveImpostor(ByteBuffer pixels, String name, int width, int height) { try { pixels.rewind(); - BufferedImage img = new BufferedImage( - IMPOSTOR_SIZE, IMPOSTOR_SIZE, BufferedImage.TYPE_INT_ARGB); - for (int y = 0; y < IMPOSTOR_SIZE; y++) { - for (int x = 0; x < IMPOSTOR_SIZE; x++) { + BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { int r = pixels.get() & 0xFF, g = pixels.get() & 0xFF, b = pixels.get() & 0xFF, a = pixels.get() & 0xFF; - img.setRGB(x, IMPOSTOR_SIZE - 1 - y, (a<<24)|(r<<16)|(g<<8)|b); + img.setRGB(x, height - 1 - y, (a<<24)|(r<<16)|(g<<8)|b); } } Path texDir = ASSET_ROOT.resolve("Textures").resolve("impostor"); Files.createDirectories(texDir); - ImageIO.write(img, "PNG", texDir.resolve(name + ".png").toFile()); + File pngFile = texDir.resolve(name + ".png").toFile(); + ImageIO.write(img, "PNG", pngFile); + try { + return (Texture2D) assets.loadTexture("Textures/impostor/" + name + ".png"); + } catch (Exception ignored) { + pixels.rewind(); + Image jmeImg = new Image(Image.Format.RGBA8, width, height, pixels, null, + com.jme3.texture.image.ColorSpace.sRGB); + return new Texture2D(jmeImg); + } } catch (IOException e) { log.error("[EzTree] Impostor-Fehler: {}", e.getMessage()); + return null; } } - private void exportTree(Node treeNode, String fileName, String subPath) { + private ByteBuffer combineAtlas(ByteBuffer[] passes) { + ByteBuffer atlas = BufferUtils.createByteBuffer(ATLAS_W * ATLAS_H * 4); + for (int d = 0; d < ATLAS_DIRS; d++) { + ByteBuffer src = passes[d]; + src.rewind(); + for (int y = 0; y < IMPOSTOR_SIZE; y++) { + for (int x = 0; x < IMPOSTOR_SIZE; x++) { + int srcOff = (y * IMPOSTOR_SIZE + x) * 4; + int dstOff = (y * ATLAS_W + d * IMPOSTOR_SIZE + x) * 4; + atlas.put(dstOff, src.get(srcOff)); + atlas.put(dstOff + 1, src.get(srcOff + 1)); + atlas.put(dstOff + 2, src.get(srcOff + 2)); + atlas.put(dstOff + 3, src.get(srcOff + 3)); + } + } + } + return atlas; + } + + private Node assembleLodNode(String name, Node hd, Node ld1, BoundingBox bb, Texture2D atlasTex) { + Node root = new Node(name != null ? name : "ez_tree"); + root.attachChild(hd); + root.attachChild(ld1); + Node lod2 = makeImpostorNode(bb, atlasTex); + root.attachChild(lod2); + + hd.setCullHint(Spatial.CullHint.Inherit); + ld1.setCullHint(Spatial.CullHint.Always); + lod2.setCullHint(Spatial.CullHint.Always); + + root.addControl(new EzTreeLodControl(app.getCamera(), hd, ld1, lod2, 40f, 120f)); + return root; + } + + private Node makeImpostorNode(BoundingBox bb, Texture2D tex) { + float h = bb != null ? bb.getYExtent() * 2f : 10f; + float w = bb != null ? Math.max(bb.getXExtent(), bb.getZExtent()) * 2f : 4f; + float size = Math.max(h, w); + float yOff = bb != null ? bb.getCenter().y : 5f; + + Material mat = new Material(assets, "Common/MatDefs/Misc/Unshaded.j3md"); + if (tex != null) mat.setTexture("ColorMap", tex); + else mat.setColor("Color", new ColorRGBA(0.18f, 0.5f, 0.1f, 0.9f)); + mat.getAdditionalRenderState().setBlendMode(com.jme3.material.RenderState.BlendMode.Alpha); + mat.getAdditionalRenderState().setFaceCullMode(com.jme3.material.RenderState.FaceCullMode.Off); + + Node n = new Node("lod2"); + for (int d = 0; d < ATLAS_DIRS; d++) { + float angle = d * com.jme3.math.FastMath.HALF_PI; + float uMin = (float) d / ATLAS_DIRS; + float uMax = (float)(d + 1) / ATLAS_DIRS; + n.attachChild(buildBillboardQuad("quad_" + d, angle, yOff, size, mat.clone(), uMin, uMax)); + } + n.setQueueBucket(RenderQueue.Bucket.Transparent); + return n; + } + + private Geometry buildBillboardQuad(String name, float yRot, float yCent, + float size, Material mat, float uMin, float uMax) { + float hw = size * 0.5f; + float hh = size * 0.5f; + float cos = com.jme3.math.FastMath.cos(yRot); + float sin = com.jme3.math.FastMath.sin(yRot); + Mesh mesh = new Mesh(); + mesh.setBuffer(VertexBuffer.Type.Position, 3, new float[]{ + -hw*cos, yCent-hh, -hw*sin, + hw*cos, yCent-hh, hw*sin, + hw*cos, yCent+hh, hw*sin, + -hw*cos, yCent+hh, -hw*sin + }); + mesh.setBuffer(VertexBuffer.Type.TexCoord, 2, new float[]{ + uMin, 0f, uMax, 0f, uMax, 1f, uMin, 1f + }); + mesh.setBuffer(VertexBuffer.Type.Index, 3, new int[]{0,1,2, 0,2,3, 2,1,0, 3,2,0}); + mesh.updateBound(); + Geometry g = new Geometry(name, mesh); + g.setMaterial(mat); + return g; + } + + private void exportTree(Node lodRoot, String fileName, String subPath) { try { - treeNode.setLocalScale(0.33f); - treeNode.updateGeometricState(); Path baseDir = ASSET_ROOT.resolve("Models").resolve("trees").resolve(subPath); Files.createDirectories(baseDir); File out = baseDir.resolve(fileName + ".j3o").toFile(); - BinaryExporter.getInstance().save(treeNode, out); + // Controls vor Export entfernen (nicht serialisierbar über BinaryExporter) + while (lodRoot.getNumControls() > 0) lodRoot.removeControl(lodRoot.getControl(0)); + BinaryExporter.getInstance().save(lodRoot, out); log.info("[EZ-Tree] Gespeichert: {}", out.getAbsolutePath()); input.treeGenStatusMsg = "Gespeichert: Models/trees/" + subPath + "/" + fileName + ".j3o"; input.refreshAssets = true; @@ -562,6 +715,32 @@ public class EzTreeState extends BaseAppState { } } + // ── LOD-Control ─────────────────────────────────────────────────────────── + + private static final class EzTreeLodControl extends com.jme3.scene.control.AbstractControl { + private final Camera cam; + private final Node lod0, lod1, lod2; + private final float d01sq, d12sq; + + EzTreeLodControl(Camera cam, Node l0, Node l1, Node l2, float d01, float d12) { + this.cam = cam; + this.lod0 = l0; this.lod1 = l1; this.lod2 = l2; + this.d01sq = d01 * d01; + this.d12sq = d12 * d12; + } + + @Override + protected void controlUpdate(float tpf) { + float dSq = cam.getLocation().distanceSquared(spatial.getWorldTranslation()); + lod0.setCullHint(dSq < d01sq ? Spatial.CullHint.Inherit : Spatial.CullHint.Always); + lod1.setCullHint(dSq >= d01sq && dSq < d12sq ? Spatial.CullHint.Inherit : Spatial.CullHint.Always); + lod2.setCullHint(dSq >= d12sq ? Spatial.CullHint.Inherit : Spatial.CullHint.Always); + } + + @Override protected void controlRender(com.jme3.renderer.RenderManager rm, + com.jme3.renderer.ViewPort vp) {} + } + private static String resolveSubPath(String presetName) { if (presetName == null) return "unknown"; String lo = presetName.toLowerCase(); diff --git a/blight-editor/src/main/java/de/blight/editor/state/FernGeneratorState.java b/blight-editor/src/main/java/de/blight/editor/state/FernGeneratorState.java new file mode 100644 index 0000000..07bd7a9 --- /dev/null +++ b/blight-editor/src/main/java/de/blight/editor/state/FernGeneratorState.java @@ -0,0 +1,130 @@ +package de.blight.editor.state; + +import com.jme3.app.Application; +import com.jme3.app.SimpleApplication; +import com.jme3.app.state.BaseAppState; +import com.jme3.asset.AssetManager; +import com.jme3.bounding.BoundingBox; +import com.jme3.export.binary.BinaryExporter; +import com.jme3.material.Material; +import com.jme3.material.RenderState; +import com.jme3.math.Vector3f; +import com.jme3.renderer.queue.RenderQueue; +import com.jme3.scene.Geometry; +import com.jme3.scene.Node; +import com.jme3.scene.Spatial; +import com.jme3.texture.Texture; +import de.blight.editor.SharedInput; +import de.blight.editor.tree.FernMeshBuilder; +import de.blight.editor.tree.FernOptions; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +public class FernGeneratorState extends BaseAppState { + + private static final Logger log = LoggerFactory.getLogger(FernGeneratorState.class); + private static final Path ASSET_ROOT = de.blight.editor.ProjectRoot.resolve( + "blight-assets", "src", "main", "resources"); + + private final SharedInput input; + private SimpleApplication app; + private AssetManager assets; + private TreeGeneratorState previewHost; + + public FernGeneratorState(SharedInput input) { this.input = input; } + + @Override protected void initialize(Application app) { + this.app = (SimpleApplication) app; + this.assets = app.getAssetManager(); + } + @Override protected void cleanup(Application app) {} + @Override protected void onEnable() {} + @Override protected void onDisable() {} + + @Override + public void update(float tpf) { + if (previewHost == null) { + previewHost = getStateManager().getState(TreeGeneratorState.class); + if (previewHost == null) return; + } + + SharedInput.FernGenRequest req = input.fernGenQueue.poll(); + if (req == null) return; + + FernOptions opts = req.options(); + Node fern = FernMeshBuilder.build(opts); + applyMaterial(fern, opts); + fern.updateGeometricState(); + + BoundingBox bb = fern.getWorldBound() instanceof BoundingBox b ? b : null; + float dist = bb != null + ? Math.max(bb.getXExtent(), Math.max(bb.getYExtent(), bb.getZExtent())) * 4f + : 3f; + Vector3f target = bb != null ? new Vector3f(0f, bb.getCenter().y, 0f) + : new Vector3f(0f, 0.4f, 0f); + + final Node finalFern = fern; + final float finalDist = dist; + final Vector3f finalTarget = target; + final boolean doExport = req.exportAfter(); + + app.enqueue(() -> { + previewHost.setPreviewContent(finalFern, finalDist, finalTarget); + if (doExport) exportFern(finalFern); + }); + input.treeGenStatusMsg = doExport ? "Farn: exportiere…" : "Farn: Vorschau"; + } + + private void applyMaterial(Node fern, FernOptions opts) { + Material mat; + try { + mat = new Material(assets, "MatDefs/Fern.j3md"); + mat.setFloat("WindStrength", opts.windStrength); + mat.setFloat("WindSpeed", opts.windSpeed); + try { + Texture diff = assets.loadTexture("Textures/fern/Fern02_Diffuse.tga"); + mat.setTexture("DiffuseMap", diff); + mat.setBoolean("HasDiffuseMap", true); + } catch (Exception ignored) {} + try { + Texture norm = assets.loadTexture("Textures/fern/Fern02_Normal.tga"); + mat.setTexture("NormalMap", norm); + mat.setBoolean("HasNormalMap", true); + } catch (Exception ignored) {} + mat.getAdditionalRenderState().setFaceCullMode(RenderState.FaceCullMode.Off); + } catch (Exception e) { + mat = new Material(assets, "Common/MatDefs/Misc/Unshaded.j3md"); + mat.setColor("Color", new com.jme3.math.ColorRGBA(0.1f, 0.55f, 0.1f, 1f)); + mat.getAdditionalRenderState().setFaceCullMode(RenderState.FaceCullMode.Off); + } + for (Spatial child : fern.getChildren()) { + if (child instanceof Geometry g) { + g.setMaterial(mat.clone()); + g.setQueueBucket(RenderQueue.Bucket.Transparent); + g.setShadowMode(RenderQueue.ShadowMode.CastAndReceive); + } + } + } + + private void exportFern(Node fern) { + try { + Path dir = ASSET_ROOT.resolve("Models").resolve("plants").resolve("fern"); + Files.createDirectories(dir); + String ts = DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss").format(LocalDateTime.now()); + Path out = dir.resolve("fern_" + ts + ".j3o"); + BinaryExporter.getInstance().save(fern, out.toFile()); + log.info("[Farn] Gespeichert: {}", out); + input.treeGenStatusMsg = "Gespeichert: Models/plants/fern/fern_" + ts + ".j3o"; + input.refreshAssets = true; + } catch (IOException e) { + log.error("[Farn] Export-Fehler: {}", e.getMessage()); + input.treeGenStatusMsg = "Farn Export-Fehler: " + e.getMessage(); + } + } +} diff --git a/blight-editor/src/main/java/de/blight/editor/state/GrassVertexState.java b/blight-editor/src/main/java/de/blight/editor/state/GrassVertexState.java index b385bc5..5d15577 100644 --- a/blight-editor/src/main/java/de/blight/editor/state/GrassVertexState.java +++ b/blight-editor/src/main/java/de/blight/editor/state/GrassVertexState.java @@ -45,10 +45,14 @@ public class GrassVertexState extends BaseAppState { static final float WIDTH_FACTOR = 0.05f; // Basis-Halbbreite = Höhe × WIDTH_FACTOR static final float BEND_FACTOR = 0.15f; // max. Krümmungsversatz an der Spitze - static final ColorRGBA ROOT_COLOR = new ColorRGBA(0.08f, 0.34f, 0.04f, 1f); - static final ColorRGBA TIP_COLOR = new ColorRGBA(0.26f, 0.72f, 0.11f, 1f); - static final ColorRGBA DRY_ROOT_COLOR = new ColorRGBA(0.45f, 0.35f, 0.08f, 1f); - static final ColorRGBA DRY_TIP_COLOR = new ColorRGBA(0.82f, 0.74f, 0.16f, 1f); + static final ColorRGBA ROOT_COLOR = new ColorRGBA(0.08f, 0.34f, 0.04f, 1f); + static final ColorRGBA TIP_COLOR = new ColorRGBA(0.26f, 0.72f, 0.11f, 1f); + // 0–50 % Trockenheit: Grün → Goldgelb + static final ColorRGBA DRY_ROOT_COLOR = new ColorRGBA(0.45f, 0.35f, 0.08f, 1f); + static final ColorRGBA DRY_TIP_COLOR = new ColorRGBA(0.82f, 0.74f, 0.16f, 1f); + // 50–100 % Trockenheit: Goldgelb → Dunkelbraun + static final ColorRGBA VERY_DRY_ROOT_COLOR = new ColorRGBA(0.18f, 0.09f, 0.02f, 1f); + static final ColorRGBA VERY_DRY_TIP_COLOR = new ColorRGBA(0.38f, 0.20f, 0.05f, 1f); // ── Zustand ─────────────────────────────────────────────────────────────── private final SharedInput input; @@ -156,20 +160,53 @@ public class GrassVertexState extends BaseAppState { private final Random rng = new Random(); - private void addBlades(Vector3f center) { - float radius = (float) input.grassVertexTool.brushRadius.getValue(); - float height = (float) input.grassVertexTool.bladeHeight.getValue(); - int density = (int) input.grassVertexTool.density.getValue(); + /** Quadratischer Falloff: 1.0 im Zentrum, 0.5 am Rand. */ + private static float brushFalloff(float distRatio) { + return 1f - 0.5f * distRatio * distRatio; + } + private void addBlades(Vector3f center) { + float radius = (float) input.grassVertexTool.brushRadius.getValue(); + float height = (float) input.grassVertexTool.bladeHeight.getValue(); + int density = (int) input.grassVertexTool.density.getValue(); + float witherPct = (float) input.grassVertexTool.dryness.getValue() / 100f; + float uniformity = (float) input.grassVertexTool.uniformity.getValue(); + float variation = (1f - uniformity) * 0.25f; // max ±25 % bei uniformity=0 + float radSq = radius * radius; + + // Kleinere Rand-Halme im Pinselbereich durch größere ersetzen + for (int ci = 0; ci < CHUNK_COUNT; ci++) { + List list = chunkBlades[ci]; + boolean changed = false; + for (int i = 0; i < list.size(); i++) { + GrassVertexBlade b = list.get(i); + float dx = b.x() - center.x, dz = b.z() - center.z; + float distSq = dx*dx + dz*dz; + if (distSq > radSq) continue; + float distRatio = (float) Math.sqrt(distSq) / radius; + float idealH = height * brushFalloff(distRatio); + // Halm ist deutlich kleiner als die aktuelle Pinselposition erlaubt → ersetzen + if (b.height() < idealH * 0.88f) { + float newH = idealH * (1f + variation * (rng.nextFloat() * 2f - 1f)); + list.set(i, new GrassVertexBlade(b.x(), b.y(), b.z(), Math.max(0.05f, newH), b.dryness())); + changed = true; + } + } + if (changed) dirtyChunks[ci] = true; + } + + // Neue Halme mit Falloff und Gleichmäßigkeits-Variation setzen for (int i = 0; i < density; i++) { - float angle = rng.nextFloat() * (float) (Math.PI * 2); - float r = rng.nextFloat() * radius; - float bx = center.x + (float) Math.cos(angle) * r; - float bz = center.z + (float) Math.sin(angle) * r; - float by = terrain.getHeight(new Vector2f(bx, bz)); + float angle = rng.nextFloat() * (float) (Math.PI * 2); + float r = rng.nextFloat() * radius; + float bx = center.x + (float) Math.cos(angle) * r; + float bz = center.z + (float) Math.sin(angle) * r; + float by = terrain.getHeight(new Vector2f(bx, bz)); if (Float.isNaN(by)) continue; - float h = height * (0.75f + rng.nextFloat() * 0.5f); - float witherPct = (float) input.grassVertexTool.dryness.getValue() / 100f; + float distRatio = r / radius; + float h = height * brushFalloff(distRatio) + * (1f + variation * (rng.nextFloat() * 2f - 1f)); + h = Math.max(0.05f, h); float bladeDryness = rng.nextFloat() < witherPct ? 0.5f + rng.nextFloat() * 0.5f : 0f; GrassVertexBlade blade = new GrassVertexBlade(bx, by, bz, h, bladeDryness); @@ -381,10 +418,23 @@ public class GrassVertexState extends BaseAppState { float dr = DRY_ROOT_COLOR.r + (DRY_TIP_COLOR.r - DRY_ROOT_COLOR.r) * wf; float dg = DRY_ROOT_COLOR.g + (DRY_TIP_COLOR.g - DRY_ROOT_COLOR.g) * wf; float db = DRY_ROOT_COLOR.b + (DRY_TIP_COLOR.b - DRY_ROOT_COLOR.b) * wf; - col[ci] = gr + (dr - gr) * dryness; - col[ci+1] = gg + (dg - gg) * dryness; - col[ci+2] = gb + (db - gb) * dryness; - col[ci+3] = 1f; + float vr = VERY_DRY_ROOT_COLOR.r + (VERY_DRY_TIP_COLOR.r - VERY_DRY_ROOT_COLOR.r) * wf; + float vg = VERY_DRY_ROOT_COLOR.g + (VERY_DRY_TIP_COLOR.g - VERY_DRY_ROOT_COLOR.g) * wf; + float vb = VERY_DRY_ROOT_COLOR.b + (VERY_DRY_TIP_COLOR.b - VERY_DRY_ROOT_COLOR.b) * wf; + // Zwei-Segment-Gradient: 0→0.5 = grün→goldgelb, 0.5→1.0 = goldgelb→dunkelbraun + float fr, fg, fb; + if (dryness <= 0.5f) { + float t = dryness * 2f; + fr = gr + (dr - gr) * t; + fg = gg + (dg - gg) * t; + fb = gb + (db - gb) * t; + } else { + float t = (dryness - 0.5f) * 2f; + fr = dr + (vr - dr) * t; + fg = dg + (vg - dg) * t; + fb = db + (vb - db) * t; + } + col[ci] = fr; col[ci+1] = fg; col[ci+2] = fb; col[ci+3] = 1f; int ti = vi * 2; tex[ti] = wf; tex[ti+1] = 0f; diff --git a/blight-editor/src/main/java/de/blight/editor/state/ItemPlacementState.java b/blight-editor/src/main/java/de/blight/editor/state/ItemPlacementState.java new file mode 100644 index 0000000..5a85c0e --- /dev/null +++ b/blight-editor/src/main/java/de/blight/editor/state/ItemPlacementState.java @@ -0,0 +1,188 @@ +package de.blight.editor.state; + +import com.jme3.app.Application; +import com.jme3.app.SimpleApplication; +import com.jme3.app.state.BaseAppState; +import com.jme3.asset.AssetManager; +import com.jme3.collision.CollisionResults; +import com.jme3.material.Material; +import com.jme3.math.*; +import com.jme3.renderer.Camera; +import com.jme3.scene.*; +import com.jme3.scene.shape.Box; +import com.jme3.terrain.geomipmap.TerrainQuad; +import de.blight.common.PlacedItem; +import de.blight.common.PlacedItemIO; +import de.blight.editor.SharedInput; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * Verwaltet die Platzierung von Items (Pickups) auf der Karte im Editor. + * Aktiv wenn {@code input.activeLayer == LAYER_ITEMS}. + */ +public class ItemPlacementState extends BaseAppState { + + private static final Logger log = LoggerFactory.getLogger(ItemPlacementState.class); + + private final SharedInput input; + private SimpleApplication app; + private Camera cam; + private AssetManager assets; + private Node rootNode; + private TerrainQuad terrain; + + private final List items = new ArrayList<>(); + private final List nodes = new ArrayList<>(); + private Node itemRoot; + private Node previewNode; + + public ItemPlacementState(SharedInput input) { + this.input = input; + } + + public void setTerrain(TerrainQuad terrain) { + this.terrain = terrain; + } + + // ── Lifecycle ───────────────────────────────────────────────────────────── + + @Override + protected void initialize(Application app) { + this.app = (SimpleApplication) app; + this.cam = app.getCamera(); + this.assets = app.getAssetManager(); + this.rootNode = this.app.getRootNode(); + + itemRoot = new Node("itemRoot"); + previewNode = new Node("itemPreview"); + previewNode.setCullHint(Spatial.CullHint.Always); + Geometry prev = new Geometry("prev", new Box(0.15f, 0.15f, 0.15f)); + Material pm = new Material(assets, "Common/MatDefs/Misc/Unshaded.j3md"); + pm.setColor("Color", new ColorRGBA(1f, 0.82f, 0.1f, 0.6f)); + prev.setMaterial(pm); + prev.getMesh().setMode(com.jme3.scene.Mesh.Mode.Lines); + previewNode.attachChild(prev); + } + + @Override + protected void onEnable() { + items.clear(); + nodes.clear(); + itemRoot.detachAllChildren(); + + try { + items.addAll(PlacedItemIO.load()); + } catch (Exception e) { + log.warn("[ItemPlacement] Laden fehlgeschlagen: {}", e.getMessage()); + } + + for (PlacedItem pi : items) { + Node n = buildItemNode(pi.itemId()); + n.setLocalTranslation(pi.x(), pi.y() + 0.25f, pi.z()); + itemRoot.attachChild(n); + nodes.add(n); + } + + rootNode.attachChild(itemRoot); + rootNode.attachChild(previewNode); + } + + @Override + protected void onDisable() { + itemRoot.removeFromParent(); + previewNode.removeFromParent(); + } + + @Override + protected void cleanup(Application app) {} + + // ── Update ──────────────────────────────────────────────────────────────── + + @Override + public void update(float tpf) { + updatePreview(); + + SharedInput.ObjectClick click; + while ((click = input.itemClickQueue.poll()) != null) { + if (click.rightButton()) { + input.pendingItemId = null; + input.activeLayer = 0; + } else { + handlePlace(click); + } + } + } + + private void updatePreview() { + if (input.activeLayer != SharedInput.LAYER_ITEMS + || input.pendingItemId == null + || terrain == null + || input.mouseScreenX < 0) { + previewNode.setCullHint(Spatial.CullHint.Always); + return; + } + float jx = input.mouseScreenX * (float) input.viewportScaleX; + float jy = cam.getHeight() - input.mouseScreenY * (float) input.viewportScaleY; + Ray ray = screenToRay(jx, jy); + CollisionResults hits = new CollisionResults(); + terrain.collideWith(ray, hits); + if (hits.size() == 0) { + previewNode.setCullHint(Spatial.CullHint.Always); + return; + } + Vector3f pt = hits.getClosestCollision().getContactPoint(); + previewNode.setLocalTranslation(pt.x, pt.y + 0.25f, pt.z); + previewNode.setCullHint(Spatial.CullHint.Inherit); + } + + private void handlePlace(SharedInput.ObjectClick click) { + if (terrain == null || input.pendingItemId == null) return; + float jx = click.screenX() * (float) input.viewportScaleX; + float jy = cam.getHeight() - click.screenY() * (float) input.viewportScaleY; + Ray ray = screenToRay(jx, jy); + CollisionResults hits = new CollisionResults(); + terrain.collideWith(ray, hits); + if (hits.size() == 0) return; + + Vector3f pt = hits.getClosestCollision().getContactPoint(); + PlacedItem pi = new PlacedItem(input.pendingItemId, pt.x, pt.y, pt.z); + items.add(pi); + + Node n = buildItemNode(pi.itemId()); + n.setLocalTranslation(pt.x, pt.y + 0.25f, pt.z); + itemRoot.attachChild(n); + nodes.add(n); + + try { + PlacedItemIO.save(items); + log.info("[ItemPlacement] Item '{}' platziert bei ({}, {}, {})", + pi.itemId(), pt.x, pt.y, pt.z); + } catch (IOException e) { + log.warn("[ItemPlacement] Speichern fehlgeschlagen: {}", e.getMessage()); + } + } + + // ── Hilfsmethoden ──────────────────────────────────────────────────────── + + private Node buildItemNode(String itemId) { + Node n = new Node("item_" + itemId); + Geometry g = new Geometry("itemGeo_" + itemId, new Box(0.15f, 0.15f, 0.15f)); + Material mat = new Material(assets, "Common/MatDefs/Misc/Unshaded.j3md"); + mat.setColor("Color", new ColorRGBA(1f, 0.82f, 0.1f, 1f)); + g.setMaterial(mat); + n.attachChild(g); + n.setUserData("itemId", itemId); + return n; + } + + private Ray screenToRay(float jmeX, float jmeY) { + Vector3f near = cam.getWorldCoordinates(new Vector2f(jmeX, jmeY), 0f); + Vector3f far = cam.getWorldCoordinates(new Vector2f(jmeX, jmeY), 1f); + return new Ray(near, far.subtract(near).normalizeLocal()); + } +} diff --git a/blight-editor/src/main/java/de/blight/editor/state/ModelEditorState.java b/blight-editor/src/main/java/de/blight/editor/state/ModelEditorState.java index 496d9e6..7f98c9c 100644 --- a/blight-editor/src/main/java/de/blight/editor/state/ModelEditorState.java +++ b/blight-editor/src/main/java/de/blight/editor/state/ModelEditorState.java @@ -50,7 +50,12 @@ public class ModelEditorState extends BaseAppState { private Quaternion savedCamRot; private final SharedInput input; - private String currentPath = null; + private String currentPath = null; + private String mainModelPath = null; + + // Eingebettete LOD-Stufen (falls j3o ein LOD-Node-Baum ist) + private boolean hasEmbeddedLods = false; + private Spatial[] embeddedLodSpatials = null; // Mittelpunkt für Orbit (Bounding-Box-Zentrum des Modells) private Vector3f orbitCenter = Vector3f.ZERO.clone(); @@ -91,9 +96,34 @@ public class ModelEditorState extends BaseAppState { String openPath = input.modelEditorOpenPath; if (openPath != null) { input.modelEditorOpenPath = null; + mainModelPath = openPath; + input.modelEditorLodPreview = 0; loadModel(openPath); } + if (input.modelEditorLodChanged) { + input.modelEditorLodChanged = false; + if (hasEmbeddedLods && embeddedLodSpatials != null) { + // Eingebettete LOD-Kinder direkt ein-/ausblenden + int lodIdx = Math.min(input.modelEditorLodPreview, embeddedLodSpatials.length - 1); + for (int i = 0; i < embeddedLodSpatials.length; i++) { + embeddedLodSpatials[i].setCullHint( + i == lodIdx ? Spatial.CullHint.Inherit : Spatial.CullHint.Always); + } + } else { + String path = switch (input.modelEditorLodPreview) { + case 1 -> input.modelEditorLod1Path; + case 2 -> input.modelEditorLod2Path; + default -> mainModelPath; + }; + if (path == null || path.isBlank()) { + path = mainModelPath; + input.modelEditorLodPreview = 0; + } + if (path != null) loadModel(path); + } + } + if (previewRoot == null) return; // Schließen @@ -152,12 +182,31 @@ public class ModelEditorState extends BaseAppState { currentPath = assetPath; modelWrapper = new Node("model_wrapper"); + hasEmbeddedLods = false; + embeddedLodSpatials = null; + input.modelEditorHasEmbeddedLods = false; try { Spatial model = app.getAssetManager().loadModel(assetPath); stripControls(model); modelWrapper.attachChild(model); + + // Eingebettete LODs erkennen: Node mit ≥2 Kindern, wobei Kind 0 sichtbar + // und alle weiteren mit CullHint.Always gesetzt sind (EZ-Tree / TreeGenerator-Muster). + if (model instanceof Node rootNode && rootNode.getChildren().size() >= 2) { + var children = rootNode.getChildren(); + boolean lodPattern = children.stream().skip(1) + .allMatch(s -> s.getCullHint() == Spatial.CullHint.Always); + if (lodPattern) { + embeddedLodSpatials = children.toArray(new Spatial[0]); + hasEmbeddedLods = true; + input.modelEditorHasEmbeddedLods = true; + } + } } catch (Exception e) { - // Fallback: roter Quader + System.err.println("[ModelEditor] Fehler beim Laden von '" + assetPath + "': " + e.getMessage()); + e.printStackTrace(); + input.modelEditorBoundsReady = false; + // Fallback: roter Quader als visuelles Signal Geometry box = new Geometry("error_box", new Box(0.5f, 0.5f, 0.5f)); Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); mat.setColor("Color", ColorRGBA.Red); @@ -243,6 +292,9 @@ public class ModelEditorState extends BaseAppState { modelWrapper = null; gridGeo = null; } + hasEmbeddedLods = false; + embeddedLodSpatials = null; + input.modelEditorHasEmbeddedLods = false; app.getRootNode().setCullHint(Spatial.CullHint.Inherit); if (savedCamPos != null) { diff --git a/blight-editor/src/main/java/de/blight/editor/state/SceneObjectState.java b/blight-editor/src/main/java/de/blight/editor/state/SceneObjectState.java index b7063d9..3d0089b 100644 --- a/blight-editor/src/main/java/de/blight/editor/state/SceneObjectState.java +++ b/blight-editor/src/main/java/de/blight/editor/state/SceneObjectState.java @@ -144,7 +144,9 @@ public class SceneObjectState extends BaseAppState { so.getScale(), so.solid, so.getTexturePath(), so.getNormalMapPath(), so.getMaterialPath(), meshFile, animClips.get(i), - so.castShadow, so.receiveShadow)); + so.castShadow, so.receiveShadow, + so.lod1Path, so.lod2Path, + so.lod1Distance, so.lod2Distance, so.cullDistance)); } return list; } @@ -168,6 +170,11 @@ public class SceneObjectState extends BaseAppState { so.setMaterialPath(pm.materialPath()); so.castShadow = pm.castShadow(); so.receiveShadow = pm.receiveShadow(); + so.lod1Path = pm.lod1Path() != null ? pm.lod1Path() : ""; + so.lod2Path = pm.lod2Path() != null ? pm.lod2Path() : ""; + so.lod1Distance = pm.lod1Distance(); + so.lod2Distance = pm.lod2Distance(); + so.cullDistance = pm.cullDistance(); objects.add(so); animClips.add(pm.animClip() != null ? pm.animClip() : ""); @@ -566,6 +573,13 @@ public class SceneObjectState extends BaseAppState { } SceneObject so = new SceneObject(modelPath, wx, wz, wy + placementOffY, defaultSolid); + if (meta != null) { + so.lod1Path = meta.lod1Path() != null ? meta.lod1Path() : ""; + so.lod2Path = meta.lod2Path() != null ? meta.lod2Path() : ""; + so.lod1Distance = meta.lod1Distance(); + so.lod2Distance = meta.lod2Distance(); + so.cullDistance = meta.cullDistance(); + } so.setRotation(0f, rotY, 0f); so.setScale(defaultScale); so.castShadow = defaultCast; @@ -1217,6 +1231,7 @@ public class SceneObjectState extends BaseAppState { try { Spatial model = assets.loadModel(req.assetPath()); if (!req.keepControls()) stripControlsRecursive(model); + com.jme3.util.TangentBinormalGenerator.generate(model); if (req.centerOrigin()) { model.setLocalTranslation(0f, 0f, 0f); diff --git a/blight-editor/src/main/java/de/blight/editor/state/TerrainEditorState.java b/blight-editor/src/main/java/de/blight/editor/state/TerrainEditorState.java index 3b8715a..d7c04cd 100644 --- a/blight-editor/src/main/java/de/blight/editor/state/TerrainEditorState.java +++ b/blight-editor/src/main/java/de/blight/editor/state/TerrainEditorState.java @@ -97,6 +97,7 @@ public class TerrainEditorState extends BaseAppState { private PlacedObjectState placedObjectState; private GrassVertexState grassVertexState; private SceneObjectState sceneObjState; + private ItemPlacementState itemPlacementState; private LightState lightState; private EmitterState emitterState; private WaterBodyState waterBodyState; @@ -231,6 +232,14 @@ public class TerrainEditorState extends BaseAppState { sceneObjState = app.getStateManager().getState(SceneObjectState.class); if (sceneObjState != null) { sceneObjState.setTerrain(terrain); + } + + itemPlacementState = app.getStateManager().getState(ItemPlacementState.class); + if (itemPlacementState != null) { + itemPlacementState.setTerrain(terrain); + } + + if (sceneObjState != null) { try { var placed = PlacedModelIO.load(); if (!placed.isEmpty()) sceneObjState.loadPlacedModels(placed); @@ -880,6 +889,14 @@ public class TerrainEditorState extends BaseAppState { catch (IOException e) { log.error("Vertex-Gras nicht speicherbar", e); } } MapIO.save(data); + if (heightSnap != null) { + try { + de.blight.common.ChunkTerrainIO.exportFromEditorHeightMap(heightSnap, TOTAL_SIZE); + log.info("Chunk-Dateien exportiert."); + } catch (IOException e) { + log.error("Chunk-Export fehlgeschlagen", e); + } + } if (models != null) PlacedModelIO.save(models); if (lights != null) LightIO.save(lights); if (emitters != null) EmitterIO.save(emitters); @@ -1193,8 +1210,7 @@ public class TerrainEditorState extends BaseAppState { private void updateCamera(float tpf) { if (input.activeLayer == SharedInput.LAYER_MODEL_EDITOR) { - input.consumeMouseDelta(); // konsumieren ohne zu verarbeiten - return; + return; // ModelEditorState konsumiert das Delta selbst } int[] delta = input.consumeMouseDelta(); if (delta[0] != 0 || delta[1] != 0) { diff --git a/blight-editor/src/main/java/de/blight/editor/state/TreeGeneratorState.java b/blight-editor/src/main/java/de/blight/editor/state/TreeGeneratorState.java index 7a93d6e..044086b 100644 --- a/blight-editor/src/main/java/de/blight/editor/state/TreeGeneratorState.java +++ b/blight-editor/src/main/java/de/blight/editor/state/TreeGeneratorState.java @@ -69,6 +69,9 @@ public class TreeGeneratorState extends BaseAppState { private static final Logger log = LoggerFactory.getLogger(TreeGeneratorState.class); private static final int IMPOSTOR_SIZE = 512; + private static final int ATLAS_DIRS = 4; + private static final int ATLAS_W = IMPOSTOR_SIZE * ATLAS_DIRS; // 2048 + private static final int ATLAS_H = IMPOSTOR_SIZE; // 512 private static final int PREVIEW_SIZE = 1024; private static final Path ASSET_ROOT = de.blight.editor.ProjectRoot.resolve("blight-assets", "src", "main", "resources"); @@ -97,10 +100,12 @@ public class TreeGeneratorState extends BaseAppState { private TreeMeshBuilder.MeshResult pendingHdResult = null; private Material pendingBarkMat = null; private Material pendingLeafMat = null; - private ViewPort captureVP = null; - private FrameBuffer captureFB = null; - private Texture2D captureTex = null; - private volatile boolean captureReady = false; // vom SceneProcessor gesetzt + private ViewPort captureVP = null; + private FrameBuffer captureFB = null; + private Texture2D captureTex = null; + private volatile boolean captureReady = false; + private int capturePass = 0; + private ByteBuffer[] capturePixels = new ByteBuffer[ATLAS_DIRS]; public TreeGeneratorState(SharedInput input) { this.input = input; } @@ -123,7 +128,7 @@ public class TreeGeneratorState extends BaseAppState { previewVP = this.app.getRenderManager().createPostView("treePreview", previewCam); previewVP.setOutputFrameBuffer(previewFB); - previewVP.setBackgroundColor(new ColorRGBA(0.50f, 0.72f, 0.95f, 1f)); + previewVP.setBackgroundColor(new ColorRGBA(0.15f, 0.15f, 0.18f, 1f)); previewVP.setClearFlags(true, true, true); previewScene = new Node("previewScene"); @@ -137,8 +142,7 @@ public class TreeGeneratorState extends BaseAppState { previewScene.addLight(new AmbientLight(new ColorRGBA(0.55f, 0.55f, 0.60f, 1f))); previewTreeHolder = new Node("treeHolder"); previewScene.attachChild(previewTreeHolder); - previewScene.attachChild(buildPreviewGround()); - previewScene.attachChild(buildPreviewSky()); + previewScene.attachChild(buildPreviewGrid()); previewVP.attachScene(previewScene); DirectionalLightShadowRenderer shadowRenderer = @@ -148,6 +152,19 @@ public class TreeGeneratorState extends BaseAppState { shadowRenderer.setShadowIntensity(0.25f); shadowRenderer.setShadowZExtend(80f); previewVP.addProcessor(shadowRenderer); + // Stellt sicher, dass previewScene direkt vor dem Rendern immer aktuell ist – + // unabhängig davon, welche AppStates nach TreeGeneratorState die Szene noch ändern. + previewVP.addProcessor(new SceneProcessor() { + private boolean inited = false; + @Override public void initialize(RenderManager rm, ViewPort v) { inited = true; } + @Override public void reshape(ViewPort v, int w, int h) {} + @Override public boolean isInitialized() { return inited; } + @Override public void preFrame(float tpf) { previewScene.updateGeometricState(); } + @Override public void postQueue(RenderQueue rq) {} + @Override public void postFrame(FrameBuffer out) {} + @Override public void cleanup() {} + @Override public void setProfiler(AppProfiler profiler) {} + }); previewTransfer = new FrameTransfer(input.treePreviewImage); previewVP.addProcessor(previewTransfer); } @@ -193,8 +210,8 @@ public class TreeGeneratorState extends BaseAppState { resizePreviewViewport(reqW, reqH); } - // 3. Kamera-Orbit + updateGeometricState immer zuletzt – - // nach allen Szenenänderungen dieser Frame + // 3. Kamera-Orbit – updateGeometricState wird jetzt per preFrame-SceneProcessor + // direkt vor dem Rendern des previewVP aufgerufen (nach allen State-Updates). if (previewVP != null) { float rotY = input.treePreviewRotY * FastMath.DEG_TO_RAD; float rotX = input.treePreviewRotX * FastMath.DEG_TO_RAD; @@ -206,7 +223,6 @@ public class TreeGeneratorState extends BaseAppState { previewTarget.y + FastMath.sin(rotX) * dist, FastMath.cos(rotY) * cosX * dist)); c.lookAt(previewTarget, Vector3f.UNIT_Y); - previewScene.updateGeometricState(); } } @@ -266,36 +282,41 @@ public class TreeGeneratorState extends BaseAppState { Node hdNode = makeTreeNode(hd, barkMat, leafMat, "hd"); Node ldNode = makeTreeNode(ld, barkMat.clone(), leafMat.clone(), "ld"); - // Capture-Viewport aufbauen - captureTex = new Texture2D(IMPOSTOR_SIZE, IMPOSTOR_SIZE, Image.Format.RGBA8); - captureFB = new FrameBuffer(IMPOSTOR_SIZE, IMPOSTOR_SIZE, 1); - captureFB.addColorTexture(captureTex); - captureFB.setDepthTexture(new Texture2D(IMPOSTOR_SIZE, IMPOSTOR_SIZE, Image.Format.Depth)); - - captureVP = buildCaptureViewPort(hdNode, hd.bounds(), captureFB); - captureReady = false; - pendingRequest = req; - pendingHdNode = hdNode; - pendingLdNode = ldNode; + pendingRequest = req; + pendingHdNode = hdNode; + pendingLdNode = ldNode; pendingHdResult = hd; - pendingBarkMat = barkMat; - pendingLeafMat = leafMat; + pendingBarkMat = barkMat; + pendingLeafMat = leafMat; + capturePass = 0; + capturePixels = new ByteBuffer[ATLAS_DIRS]; - input.treeGenStatusMsg = "Rendere Impostor…"; + startCapturePass(0); + input.treeGenStatusMsg = "Rendere Impostor (1/" + ATLAS_DIRS + ")…"; } // ── Phase 2: Capture abschließen ────────────────────────────────────────── private void finishCapture() { - // Pixel aus Framebuffer lesen ByteBuffer pixels = BufferUtils.createByteBuffer(IMPOSTOR_SIZE * IMPOSTOR_SIZE * 4); app.getRenderer().readFrameBuffer(captureFB, pixels); + capturePixels[capturePass] = pixels; cleanupCapture(); + if (capturePass < ATLAS_DIRS - 1) { + capturePass++; + input.treeGenStatusMsg = "Rendere Impostor (" + (capturePass + 1) + "/" + ATLAS_DIRS + ")…"; + startCapturePass(capturePass); + return; + } + + // Alle Richtungen erfasst – Atlas zusammensetzen String treeType = pendingRequest.treeType(); String timestamp = DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss").format(LocalDateTime.now()); - Texture2D impostorTex = saveImpostor(pixels, "impostor_" + treeType + "_" + timestamp); + ByteBuffer atlas = combineAtlas(capturePixels); + Texture2D impostorTex = saveImpostor(atlas, "impostor_" + treeType + "_" + timestamp, + ATLAS_W, ATLAS_H); Node previewTree = makeTreeNode(pendingHdResult, pendingBarkMat.clone(), pendingLeafMat.clone(), "prev"); @@ -321,6 +342,7 @@ public class TreeGeneratorState extends BaseAppState { pendingHdResult = null; pendingBarkMat = null; pendingLeafMat = null; + capturePixels = new ByteBuffer[ATLAS_DIRS]; } // ── LOD-Aufbau ──────────────────────────────────────────────────────────── @@ -346,7 +368,7 @@ public class TreeGeneratorState extends BaseAppState { float h = bb.getYExtent() * 2f; float w = Math.max(bb.getXExtent(), bb.getZExtent()) * 2f; float size = Math.max(h, w); - float yOff = bb.getCenter().y + 2f; // passt zur Baum-Offset-Y + float yOff = bb.getCenter().y + 2f; Material mat = new Material(assets, "Common/MatDefs/Misc/Unshaded.j3md"); if (tex != null) mat.setTexture("ColorMap", tex); @@ -355,14 +377,18 @@ public class TreeGeneratorState extends BaseAppState { mat.getAdditionalRenderState().setFaceCullMode(RenderState.FaceCullMode.Off); Node n = new Node("lod2"); - n.attachChild(buildBillboardQuad("quad_a", 0f, yOff, size, mat)); - n.attachChild(buildBillboardQuad("quad_b", FastMath.HALF_PI, yOff, size, mat.clone())); + for (int d = 0; d < ATLAS_DIRS; d++) { + float angle = d * FastMath.HALF_PI; + float uMin = (float) d / ATLAS_DIRS; + float uMax = (float)(d + 1) / ATLAS_DIRS; + n.attachChild(buildBillboardQuad("quad_" + d, angle, yOff, size, mat.clone(), uMin, uMax)); + } n.setQueueBucket(RenderQueue.Bucket.Transparent); return n; } private Geometry buildBillboardQuad(String name, float yRot, float yCent, - float size, Material mat) { + float size, Material mat, float uMin, float uMax) { float hw = size * 0.5f; float hh = size * 0.5f; float cos = FastMath.cos(yRot); @@ -375,8 +401,10 @@ public class TreeGeneratorState extends BaseAppState { hw*cos, yCent+hh, hw*sin, -hw*cos, yCent+hh, -hw*sin }); - mesh.setBuffer(VertexBuffer.Type.TexCoord, 2, new float[]{ 0,0, 1,0, 1,1, 0,1 }); - mesh.setBuffer(VertexBuffer.Type.Index, 3, new int[]{0,1,2, 0,2,3, 2,1,0, 3,2,0}); + mesh.setBuffer(VertexBuffer.Type.TexCoord, 2, new float[]{ + uMin, 0, uMax, 0, uMax, 1, uMin, 1 + }); + mesh.setBuffer(VertexBuffer.Type.Index, 3, new int[]{0,1,2, 0,2,3, 2,1,0, 3,2,0}); mesh.updateBound(); Geometry g = new Geometry(name, mesh); @@ -384,6 +412,37 @@ public class TreeGeneratorState extends BaseAppState { return g; } + /** Kombiniert 4 einzelne 512×512-Puffer zu einem horizontalen 2048×512-Atlas. */ + private ByteBuffer combineAtlas(ByteBuffer[] passes) { + ByteBuffer atlas = BufferUtils.createByteBuffer(ATLAS_W * ATLAS_H * 4); + for (int d = 0; d < ATLAS_DIRS; d++) { + ByteBuffer src = passes[d]; + src.rewind(); + for (int y = 0; y < IMPOSTOR_SIZE; y++) { + for (int x = 0; x < IMPOSTOR_SIZE; x++) { + int srcOff = (y * IMPOSTOR_SIZE + x) * 4; + int dstOff = (y * ATLAS_W + d * IMPOSTOR_SIZE + x) * 4; + atlas.put(dstOff, src.get(srcOff)); + atlas.put(dstOff + 1, src.get(srcOff + 1)); + atlas.put(dstOff + 2, src.get(srcOff + 2)); + atlas.put(dstOff + 3, src.get(srcOff + 3)); + } + } + } + return atlas; + } + + /** Startet einen einzelnen Capture-Durchlauf für die gegebene Richtung (Pass 0..3). */ + private void startCapturePass(int pass) { + captureTex = new Texture2D(IMPOSTOR_SIZE, IMPOSTOR_SIZE, Image.Format.RGBA8); + captureFB = new FrameBuffer(IMPOSTOR_SIZE, IMPOSTOR_SIZE, 1); + captureFB.addColorTexture(captureTex); + captureFB.setDepthTexture(new Texture2D(IMPOSTOR_SIZE, IMPOSTOR_SIZE, Image.Format.Depth)); + float angle = pass * FastMath.HALF_PI; + captureVP = buildCaptureViewPort(pendingHdNode, pendingHdResult.bounds(), captureFB, angle); + captureReady = false; + } + // ── Material-Factories ──────────────────────────────────────────────────── private Material buildBarkMaterial(TreeParams p) { @@ -458,13 +517,15 @@ public class TreeGeneratorState extends BaseAppState { // ── Offscreen-ViewPort ──────────────────────────────────────────────────── - private ViewPort buildCaptureViewPort(Node treeNode, BoundingBox bb, FrameBuffer fb) { + private ViewPort buildCaptureViewPort(Node treeNode, BoundingBox bb, FrameBuffer fb, float angle) { Camera cam = new Camera(IMPOSTOR_SIZE, IMPOSTOR_SIZE); Vector3f center = bb.getCenter().add(0f, 2f, 0f); float extent = Math.max(bb.getXExtent(), Math.max(bb.getYExtent(), bb.getZExtent())); float dist = extent * 3.0f; - cam.setLocation(center.add(0f, 0f, dist)); + float camX = FastMath.sin(angle) * dist; + float camZ = FastMath.cos(angle) * dist; + cam.setLocation(center.add(camX, 0f, camZ)); cam.lookAt(center, Vector3f.UNIT_Y); cam.setFrustumPerspective(35f, 1f, 0.1f, dist * 4f); @@ -519,18 +580,17 @@ public class TreeGeneratorState extends BaseAppState { // ── Impostor-PNG speichern ──────────────────────────────────────────────── - private Texture2D saveImpostor(ByteBuffer pixels, String name) { + private Texture2D saveImpostor(ByteBuffer pixels, String name, int width, int height) { try { pixels.rewind(); - BufferedImage img = new BufferedImage( - IMPOSTOR_SIZE, IMPOSTOR_SIZE, BufferedImage.TYPE_INT_ARGB); - for (int y = 0; y < IMPOSTOR_SIZE; y++) { - for (int x = 0; x < IMPOSTOR_SIZE; x++) { + BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { int r = pixels.get() & 0xFF; int g = pixels.get() & 0xFF; int b = pixels.get() & 0xFF; int a = pixels.get() & 0xFF; - img.setRGB(x, IMPOSTOR_SIZE - 1 - y, (a<<24)|(r<<16)|(g<<8)|b); + img.setRGB(x, height - 1 - y, (a<<24)|(r<<16)|(g<<8)|b); } } Path texDir = ASSET_ROOT.resolve("Textures").resolve("impostor"); @@ -543,12 +603,12 @@ public class TreeGeneratorState extends BaseAppState { return (Texture2D) assets.loadTexture("Textures/impostor/" + name + ".png"); } catch (Exception loadEx) { pixels.rewind(); - Image jmeImg = new Image(Image.Format.RGBA8, IMPOSTOR_SIZE, IMPOSTOR_SIZE, + Image jmeImg = new Image(Image.Format.RGBA8, width, height, pixels, null, com.jme3.texture.image.ColorSpace.sRGB); return new Texture2D(jmeImg); } } catch (IOException e) { - System.err.println("[TreeGenerator] Impostor-Fehler: " + e.getMessage()); + log.error("[Blight-Baum] Impostor-Fehler: {}", e.getMessage()); return null; } } @@ -615,45 +675,47 @@ public class TreeGeneratorState extends BaseAppState { @Override protected void controlRender(RenderManager rm, ViewPort vp) {} } - // ── Vorschau-Boden (groß, Gras-Textur) ────────────────────────────────── + // ── Vorschau-Raster (Offscreen-VP, analog zum Objekt-Editor) ──────────── + // Rendert in previewFB — völlig isoliert vom Haupt-Viewport des Welt-Editors. - private Geometry buildPreviewGround() { - float size = 600f; - float tiles = 30f; // UV-Wiederholungen + private Geometry buildPreviewGrid() { + float halfSize = 20f; + int n = (int)(halfSize * 2); + int lines = (n + 1) * 2; - // Eigenes Mesh mit gekachelten UVs (Quad unterstützt kein Tiling) - com.jme3.scene.Mesh mesh = new com.jme3.scene.Mesh(); - float h = size * 0.5f; - mesh.setBuffer(VertexBuffer.Type.Position, 3, - new float[]{ -h,0,-h, h,0,-h, h,0,h, -h,0,h }); - mesh.setBuffer(VertexBuffer.Type.Normal, 3, - new float[]{ 0,1,0, 0,1,0, 0,1,0, 0,1,0 }); - mesh.setBuffer(VertexBuffer.Type.TexCoord, 2, - new float[]{ 0,0, tiles,0, tiles,tiles, 0,tiles }); - mesh.setBuffer(VertexBuffer.Type.Index, 3, - new int[]{ 0,2,1, 0,3,2 }); + java.nio.FloatBuffer pos = BufferUtils.createFloatBuffer(lines * 2 * 3); + java.nio.FloatBuffer col = BufferUtils.createFloatBuffer(lines * 2 * 4); + + for (int i = 0; i <= n; i++) { + float coord = -halfSize + i; + boolean major5 = (Math.abs(Math.round(coord)) % 5) == 0; + boolean major10 = (Math.abs(Math.round(coord)) % 10) == 0; + float bright = major10 ? 0.70f : major5 ? 0.45f : 0.22f; + + pos.put(coord).put(0).put(-halfSize); + pos.put(coord).put(0).put( halfSize); + col.put(bright).put(bright).put(bright).put(1f); + col.put(bright).put(bright).put(bright).put(1f); + + pos.put(-halfSize).put(0).put(coord); + pos.put( halfSize).put(0).put(coord); + col.put(bright).put(bright).put(bright).put(1f); + col.put(bright).put(bright).put(bright).put(1f); + } + pos.flip(); col.flip(); + + Mesh mesh = new Mesh(); + mesh.setMode(Mesh.Mode.Lines); + mesh.setBuffer(VertexBuffer.Type.Position, 3, pos); + mesh.setBuffer(VertexBuffer.Type.Color, 4, col); mesh.updateBound(); - Geometry ground = new Geometry("previewGround", mesh); + Material mat = new Material(assets, "Common/MatDefs/Misc/Unshaded.j3md"); + mat.setBoolean("VertexColor", true); - Material mat = new Material(assets, "Common/MatDefs/Light/Lighting.j3md"); - mat.setBoolean("UseMaterialColors", true); - mat.setColor("Diffuse", new ColorRGBA(0.28f, 0.45f, 0.14f, 1f)); - mat.setColor("Ambient", new ColorRGBA(0.11f, 0.18f, 0.06f, 1f)); - mat.setColor("Specular", ColorRGBA.Black); - mat.setFloat("Shininess", 0f); - - try { - Texture grassTex = assets.loadTexture("Textures/gras.png"); - grassTex.setWrap(Texture.WrapMode.Repeat); - mat.setTexture("DiffuseMap", grassTex); - } catch (Exception ignored) { - // Fallback auf Farbe, wenn Textur fehlt - } - - ground.setMaterial(mat); - ground.setShadowMode(RenderQueue.ShadowMode.Receive); - return ground; + Geometry geo = new Geometry("previewGrid", mesh); + geo.setMaterial(mat); + return geo; } // ── Skybox (Kuppel) ─────────────────────────────────────────────────────── diff --git a/blight-editor/src/main/java/de/blight/editor/tool/GrassVertexTool.java b/blight-editor/src/main/java/de/blight/editor/tool/GrassVertexTool.java index ce26af6..3294787 100644 --- a/blight-editor/src/main/java/de/blight/editor/tool/GrassVertexTool.java +++ b/blight-editor/src/main/java/de/blight/editor/tool/GrassVertexTool.java @@ -4,10 +4,12 @@ import java.util.List; public class GrassVertexTool extends EditorTool { - public final ToolParameter brushRadius = new ToolParameter("Pinselradius", 5.0, 1.0, 50.0); - public final ToolParameter bladeHeight = new ToolParameter("Halmhöhe", 0.6, 0.1, 2.0); - public final ToolParameter density = new ToolParameter("Dichte", 5.0, 1.0, 100.0); - public final ToolParameter dryness = new ToolParameter("Vertrocknet %", 0.0, 0.0, 100.0); + public final ToolParameter brushRadius = new ToolParameter("Pinselradius", 5.0, 1.0, 50.0); + public final ToolParameter bladeHeight = new ToolParameter("Halmhöhe", 0.6, 0.1, 2.0); + public final ToolParameter density = new ToolParameter("Dichte", 5.0, 1.0, 100.0); + public final ToolParameter dryness = new ToolParameter("Vertrocknet %", 0.0, 0.0, 100.0); + /** 1.0 = exakt gleiche Höhe, 0.0 = ±25 % Zufallsvariation */ + public final ToolParameter uniformity = new ToolParameter("Gleichmäßigkeit", 1.0, 0.0, 1.0); @Override public String getName() { return "Gras (Vertices)"; } @@ -15,5 +17,5 @@ public class GrassVertexTool extends EditorTool { public List getChoiceParameters() { return List.of(); } @Override - public List getParameters() { return List.of(brushRadius, bladeHeight, density, dryness); } + public List getParameters() { return List.of(brushRadius, bladeHeight, density, dryness, uniformity); } } diff --git a/blight-editor/src/main/java/de/blight/editor/tree/FernMeshBuilder.java b/blight-editor/src/main/java/de/blight/editor/tree/FernMeshBuilder.java new file mode 100644 index 0000000..4603713 --- /dev/null +++ b/blight-editor/src/main/java/de/blight/editor/tree/FernMeshBuilder.java @@ -0,0 +1,174 @@ +package de.blight.editor.tree; + +import com.jme3.math.FastMath; +import com.jme3.scene.Geometry; +import com.jme3.scene.Mesh; +import com.jme3.scene.Node; +import com.jme3.scene.VertexBuffer; +import com.jme3.util.BufferUtils; + +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.util.Random; + +/** + * Baut einen prozeduralen Farn als Roset­te von Band-Fächern. + * + * UV-Atlas (aus FernPlantV2.obj abgeleitet): + * 5 Fächer-Varianten nebeneinander in U-Richtung: + * Spalte 0: U ∈ [0.081, 0.249] + * Spalte 1: U ∈ [0.249, 0.416] + * Spalte 2: U ∈ [0.416, 0.585] + * Spalte 3: U ∈ [0.585, 0.750] + * Spalte 4: U ∈ [0.750, 0.914] + * V-Richtung: V=0 = Wurzel, V=1 = Spitze + * + * Pro Scheitelpunktpaar: + * linke Kante = (U_spalteLinks, t) + * rechte Kante = (U_spalteRechts, t) + * + * Breiten-Richtung: senkrecht zur Wirbelsäule, in der vertikalen Fächer-Ebene + * W = normalize(−dly·cosAz, 1, −dly·sinAz) → Fächer stehen aufrecht + * + * Vertex-Farbe R = Wind-Gewicht (0 = Wurzel → 1 = Spitze). + */ +public class FernMeshBuilder { + + // UV-Atlas: 2 Fächer-Varianten (Spalten 0+1 und Spalten 3+4). + // Spalte 2 [0.416..0.585] enthält in der Textur kein Blatt → nur 2 Varianten. + private static final float[] FROND_UL = { 0.081f, 0.585f }; // linke Spitze + private static final float[] FROND_SPINE = { 0.249f, 0.750f }; // Mittelrippe + private static final float[] FROND_UR = { 0.416f, 0.914f }; // rechte Spitze + + public static Node build(FernOptions opts) { + Random rng = new Random(opts.seed); + Node fern = new Node("fern"); + float baseAng = rng.nextFloat() * FastMath.TWO_PI; + + for (int i = 0; i < opts.frondCount; i++) { + float az = baseAng + i * (FastMath.TWO_PI / opts.frondCount) + + (rng.nextFloat() - 0.5f) * 0.55f; + float lScale = 0.75f + rng.nextFloat() * 0.50f; + float drScale = 0.80f + rng.nextFloat() * 0.40f; + float til = opts.tiltMin + rng.nextFloat() * (opts.tiltMax - opts.tiltMin); + int variant = rng.nextInt(FROND_UL.length); + Geometry g = buildFrond(opts, az, lScale, drScale, til, variant); + g.setName("frond_" + i); + fern.attachChild(g); + } + return fern; + } + + private static Geometry buildFrond(FernOptions opts, float az, + float lScale, float drScale, float til, int variant) { + int S = Math.max(2, opts.frondSegments); + float len = opts.frondLength * lScale; + float drp = opts.droop * drScale; + float tilRad = til * FastMath.DEG_TO_RAD; + + float cosA = FastMath.cos(az); + float sinA = FastMath.sin(az); + + float cosTil = FastMath.cos(tilRad); + float sinTil = FastMath.sin(tilRad); + + float uL = FROND_UL[variant]; + float uSp = FROND_SPINE[variant]; + float uR = FROND_UR[variant]; + + // Breiten-Richtung: horizontal, senkrecht zur Azimut-Richtung + float wx = sinA, wz = -cosA; // wy = 0 + + // 3 Vertex-Spalten pro Zeile: linke Spitze, Mittelrippe, rechte Spitze + int vCount = (S + 1) * 3; + int iCount = S * 12; // 4 Dreiecke × 3 Indices + + FloatBuffer pos = BufferUtils.createFloatBuffer(vCount * 3); + FloatBuffer norm = BufferUtils.createFloatBuffer(vCount * 3); + FloatBuffer uv = BufferUtils.createFloatBuffer(vCount * 2); + FloatBuffer tan = BufferUtils.createFloatBuffer(vCount * 4); + FloatBuffer col4 = BufferUtils.createFloatBuffer(vCount * 4); + IntBuffer idx = BufferUtils.createIntBuffer(iCount); + + // Breite aus UV-Aspektverhältnis (quadratische Textur vorausgesetzt) + float hw = len * (uR - uL) * 0.5f; + + for (int j = 0; j <= S; j++) { + float t = (float) j / S; + // s = Bogenlänge entlang der Wirbelsäule (korrekte Winkel für alle Neigungen) + float s = t * len; + // eff = vertikale Ableitung d(cy)/d(s) inkl. Droop + float eff = sinTil - 2f * drp * s / len; + + float cx = cosA * cosTil * s; + float cy = sinTil * s - drp * s * s / len; + float cz = sinA * cosTil * s; + + // Normale: N = T × W (T = Tangente, W = Breitenrichtung) + // ergibt (-eff·cosA, cosTil, -eff·sinA), dann normieren + float nLen = FastMath.sqrt(eff * eff + cosTil * cosTil); + float nx = -eff * cosA / nLen, ny = cosTil / nLen, nz = -eff * sinA / nLen; + + // Tangente entlang der Wirbelsäule (normiert durch nLen = |T|) + float tx = cosA * cosTil / nLen, ty = eff / nLen, tz = sinA * cosTil / nLen; + + int vi = j * 3; // linke Spitze=vi, Mittelrippe=vi+1, rechte Spitze=vi+2 + + // linke Spitze (+W) + putVec3(pos, vi*3, cx + hw*wx, cy, cz + hw*wz); + putVec3(norm, vi*3, nx, ny, nz); + putVec2(uv, vi*2, uL, t); + putVec4(tan, vi*4, tx, ty, tz, 1f); + putVec4(col4, vi*4, t, 0f, 0f, 1f); + + // Mittelrippe + putVec3(pos, vi*3+3, cx, cy, cz); + putVec3(norm, vi*3+3, nx, ny, nz); + putVec2(uv, vi*2+2, uSp, t); + putVec4(tan, vi*4+4, tx, ty, tz, 1f); + putVec4(col4, vi*4+4, t, 0f, 0f, 1f); + + // rechte Spitze (−W) + putVec3(pos, vi*3+6, cx - hw*wx, cy, cz - hw*wz); + putVec3(norm, vi*3+6, nx, ny, nz); + putVec2(uv, vi*2+4, uR, t); + putVec4(tan, vi*4+8, tx, ty, tz, 1f); + putVec4(col4, vi*4+8, t, 0f, 0f, 1f); + + if (j < S) { + int base = j * 12; + int vj = j * 3, vj1 = (j+1) * 3; + + // Linkes Panel: L(j), C(j), L(j+1) und L(j+1), C(j), C(j+1) + idx.put(base, vj); idx.put(base+1, vj+1); idx.put(base+2, vj1); + idx.put(base+3, vj1); idx.put(base+4, vj+1); idx.put(base+5, vj1+1); + + // Rechtes Panel: C(j), R(j), C(j+1) und C(j+1), R(j), R(j+1) + idx.put(base+6, vj+1); idx.put(base+7, vj+2); idx.put(base+8, vj1+1); + idx.put(base+9, vj1+1); idx.put(base+10, vj+2); idx.put(base+11, vj1+2); + } + } + + Mesh mesh = new Mesh(); + pos.rewind(); norm.rewind(); uv.rewind(); tan.rewind(); col4.rewind(); idx.rewind(); + mesh.setBuffer(VertexBuffer.Type.Position, 3, pos); + mesh.setBuffer(VertexBuffer.Type.Normal, 3, norm); + mesh.setBuffer(VertexBuffer.Type.TexCoord, 2, uv); + mesh.setBuffer(VertexBuffer.Type.Tangent, 4, tan); + mesh.setBuffer(VertexBuffer.Type.Color, 4, col4); + mesh.setBuffer(VertexBuffer.Type.Index, 3, idx); + mesh.updateBound(); + mesh.updateCounts(); + return new Geometry("frond", mesh); + } + + private static void putVec2(FloatBuffer b, int pos, float x, float y) { + b.put(pos, x); b.put(pos+1, y); + } + private static void putVec3(FloatBuffer b, int pos, float x, float y, float z) { + b.put(pos, x); b.put(pos+1, y); b.put(pos+2, z); + } + private static void putVec4(FloatBuffer b, int pos, float x, float y, float z, float w) { + b.put(pos, x); b.put(pos+1, y); b.put(pos+2, z); b.put(pos+3, w); + } +} diff --git a/blight-editor/src/main/java/de/blight/editor/tree/FernOptions.java b/blight-editor/src/main/java/de/blight/editor/tree/FernOptions.java new file mode 100644 index 0000000..9e3f091 --- /dev/null +++ b/blight-editor/src/main/java/de/blight/editor/tree/FernOptions.java @@ -0,0 +1,24 @@ +package de.blight.editor.tree; + +public class FernOptions { + public int seed = 42; + public int frondCount = 15; + public float frondLength = 0.90f; + public float droop = 0.60f; + public float tiltMin = 30f; // Grad vom Boden (0 = flach, 90 = senkrecht) + public float tiltMax = 60f; + public int frondSegments = 6; + public float heightVariation = 0.4f; + public float windStrength = 0.15f; + public float windSpeed = 0.60f; + + public FernOptions copy() { + FernOptions c = new FernOptions(); + c.seed = seed; c.frondCount = frondCount; c.frondLength = frondLength; + c.droop = droop; + c.tiltMin = tiltMin; c.tiltMax = tiltMax; + c.frondSegments = frondSegments; c.heightVariation = heightVariation; + c.windStrength = windStrength; c.windSpeed = windSpeed; + return c; + } +} diff --git a/blight-editor/src/main/resources/logback.xml b/blight-editor/src/main/resources/logback.xml index 3f0bc75..fc8e942 100644 --- a/blight-editor/src/main/resources/logback.xml +++ b/blight-editor/src/main/resources/logback.xml @@ -21,6 +21,8 @@ + + diff --git a/blight-game/src/main/java/de/blight/game/animation/AnimationAction.java b/blight-game/src/main/java/de/blight/game/animation/AnimationAction.java index f0a1969..a9fdeb0 100644 --- a/blight-game/src/main/java/de/blight/game/animation/AnimationAction.java +++ b/blight-game/src/main/java/de/blight/game/animation/AnimationAction.java @@ -12,7 +12,8 @@ public enum AnimationAction { SPRINT, JUMP, RUNNING_JUMP, - DUCK; + DUCK, + PICK_UP; /** Lesbare Bezeichnung für UI-Anzeige. */ @@ -26,6 +27,7 @@ public enum AnimationAction { case JUMP -> "Jump"; case RUNNING_JUMP -> "Running Jump"; case DUCK -> "Duck"; + case PICK_UP -> "Pick up"; }; } } diff --git a/blight-game/src/main/java/de/blight/game/config/KeyBindings.java b/blight-game/src/main/java/de/blight/game/config/KeyBindings.java index f37ded5..d59aa4f 100644 --- a/blight-game/src/main/java/de/blight/game/config/KeyBindings.java +++ b/blight-game/src/main/java/de/blight/game/config/KeyBindings.java @@ -5,23 +5,25 @@ import com.jme3.input.KeyInput; /** Speichert alle konfigurierbaren Tastenbelegungen als plain int-Felder (KeyInput-Codes). */ public class KeyBindings { - public int forward = KeyInput.KEY_W; - public int backward = KeyInput.KEY_S; - public int left = KeyInput.KEY_A; - public int right = KeyInput.KEY_D; - public int jump = KeyInput.KEY_SPACE; - public int sprint = KeyInput.KEY_LSHIFT; - public int walk = KeyInput.KEY_LMENU; + public int forward = KeyInput.KEY_W; + public int backward = KeyInput.KEY_S; + public int left = KeyInput.KEY_A; + public int right = KeyInput.KEY_D; + public int jump = KeyInput.KEY_SPACE; + public int sprint = KeyInput.KEY_LSHIFT; + public int walk = KeyInput.KEY_LMENU; + public int interact = KeyInput.KEY_E; /** Metadaten für die Config-UI: Feldname im Objekt + Anzeigename. */ public static final String[][] ENTRIES = { - {"forward", "Vorwärts"}, - {"backward", "Rückwärts"}, - {"left", "Links"}, - {"right", "Rechts"}, - {"jump", "Springen"}, - {"sprint", "Rennen"}, - {"walk", "Gehen"}, + {"forward", "Vorwärts"}, + {"backward", "Rückwärts"}, + {"left", "Links"}, + {"right", "Rechts"}, + {"jump", "Springen"}, + {"sprint", "Rennen"}, + {"walk", "Gehen"}, + {"interact", "Interagieren"}, }; public int get(String fieldName) { diff --git a/blight-game/src/main/java/de/blight/game/control/PlayerInputControl.java b/blight-game/src/main/java/de/blight/game/control/PlayerInputControl.java index 322c3a6..8eed6ab 100644 --- a/blight-game/src/main/java/de/blight/game/control/PlayerInputControl.java +++ b/blight-game/src/main/java/de/blight/game/control/PlayerInputControl.java @@ -47,6 +47,9 @@ public class PlayerInputControl { private String runningClip; /** Frames, für die JUMP erzwungen wird (überbrückt onGround()-Lag). */ private int jumpFrames = 0; + /** Läuft gerade eine Pickup-Animation? */ + private boolean pickupActive = false; + private float pickupRemaining = 0f; private final ActionListener actionListener = (name, isPressed, tpf) -> { if (paused) return; @@ -117,9 +120,33 @@ public class PlayerInputControl { inputManager.addListener(actionListener, ACTION_NAMES); } + /** + * Spielt die PICK_UP-Animation einmalig ab und blockiert Bewegung für {@code duration} Sekunden. + * Wird von WorldItemsState aufgerufen, sobald der Spieler ein Item aufnimmt. + */ + public void requestPickup(float duration) { + pickupActive = true; + pickupRemaining = duration; + forward = backward = left = right = false; + if (physicsChar != null) physicsChar.setWalkDirection(Vector3f.ZERO); + playAction(AnimationAction.PICK_UP); + currentAnim = AnimationAction.PICK_UP; + } + public void update(float tpf) { if (physicsChar == null || paused) return; + if (pickupActive) { + pickupRemaining -= tpf; + physicsChar.setWalkDirection(Vector3f.ZERO); + if (pickupRemaining <= 0f) { + pickupActive = false; + currentAnim = null; // erzwingt Neubewertung im nächsten Frame + } else { + return; + } + } + Vector3f camDir = cam.getDirection().clone().setY(0).normalizeLocal(); Vector3f camLeft = cam.getLeft().clone().setY(0).normalizeLocal(); diff --git a/blight-game/src/main/java/de/blight/game/scene/WorldScene.java b/blight-game/src/main/java/de/blight/game/scene/WorldScene.java index 2505941..bf50921 100644 --- a/blight-game/src/main/java/de/blight/game/scene/WorldScene.java +++ b/blight-game/src/main/java/de/blight/game/scene/WorldScene.java @@ -6,7 +6,6 @@ import com.jme3.app.state.BaseAppState; import com.jme3.asset.AssetManager; import com.jme3.bullet.BulletAppState; import com.jme3.bullet.collision.shapes.CapsuleCollisionShape; -import com.jme3.bullet.collision.shapes.HeightfieldCollisionShape; import com.jme3.bullet.control.CharacterControl; import com.jme3.bullet.control.RigidBodyControl; import com.jme3.bullet.util.CollisionShapeFactory; @@ -41,8 +40,11 @@ import de.blight.game.state.GrassState; import de.blight.game.state.GrassVertexRenderState; import de.blight.game.state.LocationState; import de.blight.game.state.RiverState; +import de.blight.game.state.TerrainChunkState; import de.blight.game.state.WaterBodyState; import de.blight.game.state.WeatherState; +import de.blight.game.state.InteractionHudState; +import de.blight.game.state.WorldItemsState; import de.blight.game.state.WorldObjectsState; import java.io.IOException; @@ -58,6 +60,7 @@ public class WorldScene extends BaseAppState { private BulletAppState bulletAppState; private MapData loadedMapData; private FilterPostProcessor sharedFPP; + private TerrainChunkState terrainChunkState; private final KeyBindings keyBindings; private ThirdPersonCamera thirdPersonCam; @@ -109,11 +112,12 @@ public class WorldScene extends BaseAppState { buildLighting(); BlightGame.status("Lade Terrain..."); - TerrainQuad terrain = buildTerrain(); + buildChunkTerrain(); BlightGame.status("Lade Vegetation..."); - app.getStateManager().attach(new GrassState(terrain)); - app.getStateManager().attach(new GrassVertexRenderState()); + app.getStateManager().attach(new GrassState(terrainChunkState)); + GrassVertexRenderState gvrs = new GrassVertexRenderState(terrainChunkState); + app.getStateManager().attach(gvrs); BlightGame.status("Lade Wasserflächen..."); app.getStateManager().attach(new WaterBodyState(sharedFPP)); @@ -147,6 +151,9 @@ public class WorldScene extends BaseAppState { MainCharacter mc = findMainCharacter(); if (mc != null) { app.getStateManager().attach(new LocationState(mc, character)); + app.getStateManager().attach( + new WorldItemsState(keyBindings, physicsChar, mc, playerInput)); + app.getStateManager().attach(new InteractionHudState()); } // Maus einfangen – keine Klick-Pflicht für Kamerasteuerung @@ -322,117 +329,41 @@ public class WorldScene extends BaseAppState { } // ----------------------------------------------------------------------- - // Terrain + // Terrain (Chunk-basiert) // ----------------------------------------------------------------------- /** - * Baut das Terrain. Falls eine gespeicherte Karte vorhanden ist, wird diese - * geladen; andernfalls wird ein prozedurales Demo-Terrain erzeugt. - * Setzt außerdem {@link #spawnY}. + * Erstellt den chunk-basierten TerrainChunkState. + * Lädt MapData falls vorhanden, berechnet Spawn-Y aus Chunk-Höhen, + * erstellt ein gemeinsames Terrain-Material und hängt den State ein. */ - private TerrainQuad buildTerrain() { + private void buildChunkTerrain() { if (MapIO.exists()) { try { loadedMapData = MapIO.load(); - return buildTerrainFromMap(loadedMapData); } catch (IOException e) { - System.err.println("[WorldScene] Karte nicht ladbar: " + e.getMessage() - + " — Fallback auf prozedurales Terrain."); - } - } - return buildProceduralTerrain(); - } - - /** - * Erstellt ein Terrain aus der gespeicherten {@link MapData}. - * Visuell: 4097×4097 Vertices (jeder 4. Editor-Vertex), Scale (1, 1, 1) = 1 m/Vertex. - * Physik: 513×513 Vertices (jeder 32. Editor-Vertex), Scale (8, 1, 8) – unsichtbar, - * nur für Bullet-Kollision (33,5M Dreiecke bei 4097² wären zu viel für Bullet). - */ - private TerrainQuad buildTerrainFromMap(MapData map) { - final int SRC_VERTS = MapData.TERRAIN_VERTS; // 16385 - - // ── Visuelles Terrain (4097 Vertices, 1 m/Vertex) ──────────────────── - final int GAME_VERTS = 4097; - final int STEP = (SRC_VERTS - 1) / (GAME_VERTS - 1); // 4 - - float[] heights = new float[GAME_VERTS * GAME_VERTS]; - for (int gz = 0; gz < GAME_VERTS; gz++) { - int sz = gz * STEP; - for (int gx = 0; gx < GAME_VERTS; gx++) { - heights[gz * GAME_VERTS + gx] = map.terrainHeight[sz * SRC_VERTS + gx * STEP]; + System.err.println("[WorldScene] Karte nicht ladbar: " + e.getMessage()); } } - // Temp-Spawn aus Editor-Property überschreibt gespeicherten Karten-Spawn + // Spawn aus Map oder Editor-Property String propX = System.getProperty("blight.temp.spawn.x"); String propZ = System.getProperty("blight.temp.spawn.z"); - spawnX = propX != null ? Float.parseFloat(propX) : map.spawnX; - spawnZ = propZ != null ? Float.parseFloat(propZ) : map.spawnZ; - System.out.println("[WorldScene] SpawnXZ Quelle: " + (propX != null ? "Editor-Property" : "Karte") - + " → X=" + spawnX + " Z=" + spawnZ); - - TerrainQuad terrain = new TerrainQuad("terrain", 65, GAME_VERTS, heights); - terrain.setLocalScale(1f, 1f, 1f); - terrain.setShadowMode(RenderQueue.ShadowMode.Receive); - applyTerrainMaterial(terrain, map); - rootNode.attachChild(terrain); - - // Terrain-Höhe am Spawnpunkt (scale=1 → lokale Koordinaten = Weltkoordinaten) - float terrainH = terrain.getHeight(new Vector2f(spawnX, spawnZ)); - if (Float.isNaN(terrainH)) { - float maxH = -Float.MAX_VALUE; - for (float h : heights) { if (h > maxH) maxH = h; } - terrainH = maxH; + if (loadedMapData != null) { + spawnX = propX != null ? Float.parseFloat(propX) : loadedMapData.spawnX; + spawnZ = propZ != null ? Float.parseFloat(propZ) : loadedMapData.spawnZ; } + System.out.println("[WorldScene] SpawnXZ: X=" + spawnX + " Z=" + spawnZ); + + Material mat = buildTerrainMaterial(loadedMapData); + + terrainChunkState = new TerrainChunkState(bulletAppState, mat, loadedMapData); + app.getStateManager().attach(terrainChunkState); + + // Spawn-Höhe aus Chunk-Daten + float terrainH = terrainChunkState.getHeightAt(spawnX, spawnZ); spawnY = terrainH + 10f; - - // ── Physik-Terrain: HeightfieldCollisionShape mit identischem heights[]-Array ─ - // Gleiche 4097×4097-Daten wie das visuelle Terrain → pixel-genaue Übereinstimmung. - // HeightfieldCollisionShape ist für Terrain optimiert (kein BVH, O(log n) Queries) - // und braucht keine separate TerrainQuad-Instanz. - RigidBodyControl terrainPhysics = new RigidBodyControl( - new HeightfieldCollisionShape(heights, terrain.getLocalScale()), 0f); - terrain.addControl(terrainPhysics); - bulletAppState.getPhysicsSpace().add(terrainPhysics); - - System.out.println("[WorldScene] Karte geladen, SpawnXYZ=(" - + spawnX + ", " + spawnY + ", " + spawnZ + ")"); - return terrain; - } - - /** Prozedurales Demo-Terrain als Fallback (keine gespeicherte Karte). */ - private TerrainQuad buildProceduralTerrain() { - int size = 257; - float[] heights = new float[size * size]; - for (int z = 0; z < size; z++) { - for (int x = 0; x < size; x++) { - float nx = x / (float) size; - float nz = z / (float) size; - heights[z * size + x] = - FastMath.sin(nx * FastMath.TWO_PI * 2) * 2f - + FastMath.sin(nz * FastMath.TWO_PI * 3) * 1.5f - + FastMath.sin((nx + nz) * FastMath.TWO_PI * 1.5f) * 1f; - } - } - - spawnY = 5f; - - TerrainQuad terrain = new TerrainQuad("terrain", 65, size, heights); - terrain.setLocalTranslation(0, -5f, 0); - terrain.setLocalScale(0.5f, 0.5f, 0.5f); - terrain.setShadowMode(RenderQueue.ShadowMode.Receive); - - applyTerrainMaterial(terrain, null); - - rootNode.attachChild(terrain); - - RigidBodyControl terrainPhysics = new RigidBodyControl( - CollisionShapeFactory.createMeshShape(terrain), 0f); - terrain.addControl(terrainPhysics); - bulletAppState.getPhysicsSpace().add(terrainPhysics); - - return terrain; + System.out.println("[WorldScene] SpawnXYZ=(" + spawnX + ", " + spawnY + ", " + spawnZ + ")"); } // ----------------------------------------------------------------------- @@ -588,7 +519,7 @@ public class WorldScene extends BaseAppState { new ColorRGBA(0.80f, 0.72f, 0.50f, 1f), }; - private void applyTerrainMaterial(TerrainQuad terrain, MapData map) { + private Material buildTerrainMaterial(MapData map) { if (map != null) { try { Material mat = new Material(assetManager, "Common/MatDefs/Terrain/TerrainLighting.j3md"); @@ -630,9 +561,7 @@ public class WorldScene extends BaseAppState { splatTex.setMinFilter(Texture.MinFilter.BilinearNoMipMaps); splatTex.setMagFilter(Texture.MagFilter.Bilinear); mat.setTexture("AlphaMap", splatTex); - - terrain.setMaterial(mat); - return; + return mat; } catch (Exception e) { System.err.println("[WorldScene] Splat-Material fehlgeschlagen: " + e.getMessage()); } @@ -646,13 +575,13 @@ public class WorldScene extends BaseAppState { mat.setTexture("DiffuseMap", grass); mat.setFloat("DiffuseMap_0_scale", 32f); mat.setBoolean("useTriPlanarMapping", false); - terrain.setMaterial(mat); + return mat; } catch (Exception e) { Material mat = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md"); mat.setBoolean("UseMaterialColors", true); mat.setColor("Diffuse", new ColorRGBA(0.28f, 0.58f, 0.18f, 1f)); mat.setColor("Ambient", new ColorRGBA(0.15f, 0.30f, 0.09f, 1f)); - terrain.setMaterial(mat); + return mat; } } diff --git a/blight-game/src/main/java/de/blight/game/state/GrassState.java b/blight-game/src/main/java/de/blight/game/state/GrassState.java index 4ca82b7..26e3254 100644 --- a/blight-game/src/main/java/de/blight/game/state/GrassState.java +++ b/blight-game/src/main/java/de/blight/game/state/GrassState.java @@ -16,7 +16,6 @@ import com.jme3.scene.Node; import com.jme3.scene.Spatial; import com.jme3.scene.VertexBuffer; import com.jme3.scene.control.AbstractControl; -import com.jme3.terrain.geomipmap.TerrainQuad; import com.jme3.util.BufferUtils; import de.blight.common.GrassTuft; import de.blight.common.GrassTuftIO; @@ -44,7 +43,7 @@ public class GrassState extends BaseAppState { private static final float FAR_DIST_SQ = FAR_DIST * FAR_DIST; private static final int INIT_PER_FRAME = 4; - private final TerrainQuad terrain; + private final TerrainChunkState terrainChunkState; private Camera cam; private Node grassNode; @@ -54,8 +53,8 @@ public class GrassState extends BaseAppState { private final Map slotMaterials = new LinkedHashMap<>(); private int nextChunk = 0; - public GrassState(TerrainQuad terrain) { - this.terrain = terrain; + public GrassState(TerrainChunkState terrainChunkState) { + this.terrainChunkState = terrainChunkState; } // ── Lifecycle ───────────────────────────────────────────────────────────── @@ -176,7 +175,7 @@ public class GrassState extends BaseAppState { for (int b = 0; b < BLADES_PER_TUFT; b++) { float bx = t.x() + (rng.nextFloat() - 0.5f) * TUFT_SPREAD * 2f; float bz = t.z() + (rng.nextFloat() - 0.5f) * TUFT_SPREAD * 2f; - float th = terrain.getHeight(new Vector2f(bx, bz)); + float th = terrainChunkState.getHeightAt(bx, bz); if (Float.isNaN(th)) continue; float h = t.height() * (0.7f + rng.nextFloat() * 0.6f); blades.add(new float[]{bx, th, bz, h}); diff --git a/blight-game/src/main/java/de/blight/game/state/GrassVertexRenderState.java b/blight-game/src/main/java/de/blight/game/state/GrassVertexRenderState.java index dd379a1..a0356a3 100644 --- a/blight-game/src/main/java/de/blight/game/state/GrassVertexRenderState.java +++ b/blight-game/src/main/java/de/blight/game/state/GrassVertexRenderState.java @@ -8,15 +8,11 @@ import com.jme3.material.Material; import com.jme3.material.RenderState; import com.jme3.math.ColorRGBA; import com.jme3.math.Vector3f; -import com.jme3.renderer.Camera; -import com.jme3.renderer.RenderManager; -import com.jme3.renderer.ViewPort; import com.jme3.scene.Geometry; import com.jme3.scene.Mesh; import com.jme3.scene.Node; import com.jme3.scene.Spatial; import com.jme3.scene.VertexBuffer; -import com.jme3.scene.control.AbstractControl; import com.jme3.util.BufferUtils; import de.blight.common.GrassVertexBlade; import de.blight.common.GrassVertexIO; @@ -27,8 +23,10 @@ import java.util.List; /** * Rendert Vertex-Gras-Büschel im Spiel: 3 geneigte, verjüngte Halme pro Büschel, * beleuchtet über NormalBuffer + Custom-Shader, chunk-basiertes Lazy-Loading. + * Implementiert {@link TerrainChunkState.ChunkListener}: Gras wird ab LOD 1 ausgeblendet. */ -public class GrassVertexRenderState extends BaseAppState { +public class GrassVertexRenderState extends BaseAppState + implements TerrainChunkState.ChunkListener { // ── Chunks ──────────────────────────────────────────────────────────────── private static final int TERRAIN_HALF = 2048; @@ -36,20 +34,23 @@ public class GrassVertexRenderState extends BaseAppState { private static final int CHUNKS_PER_AXIS = (TERRAIN_HALF * 2) / CHUNK_SIZE; private static final int CHUNK_COUNT = CHUNKS_PER_AXIS * CHUNKS_PER_AXIS; private static final int INIT_PER_FRAME = 4; - private static final float FAR_DIST_SQ = 200f * 200f; // ── Geometrie (identisch zu GrassVertexState) ───────────────────────────── private static final int BLADES_PER_TUFT = 3; private static final int SEGMENTS = 5; private static final float WIDTH_FACTOR = 0.05f; private static final float BEND_FACTOR = 0.15f; - private static final ColorRGBA ROOT_COLOR = new ColorRGBA(0.08f, 0.34f, 0.04f, 1f); - private static final ColorRGBA TIP_COLOR = new ColorRGBA(0.26f, 0.72f, 0.11f, 1f); - private static final ColorRGBA DRY_ROOT_COLOR = new ColorRGBA(0.45f, 0.35f, 0.08f, 1f); - private static final ColorRGBA DRY_TIP_COLOR = new ColorRGBA(0.82f, 0.74f, 0.16f, 1f); + private static final ColorRGBA ROOT_COLOR = new ColorRGBA(0.08f, 0.34f, 0.04f, 1f); + private static final ColorRGBA TIP_COLOR = new ColorRGBA(0.26f, 0.72f, 0.11f, 1f); + // 0–50 % Trockenheit: Grün → Goldgelb + private static final ColorRGBA DRY_ROOT_COLOR = new ColorRGBA(0.45f, 0.35f, 0.08f, 1f); + private static final ColorRGBA DRY_TIP_COLOR = new ColorRGBA(0.82f, 0.74f, 0.16f, 1f); + // 50–100 % Trockenheit: Goldgelb → Dunkelbraun + private static final ColorRGBA VERY_DRY_ROOT_COLOR = new ColorRGBA(0.18f, 0.09f, 0.02f, 1f); + private static final ColorRGBA VERY_DRY_TIP_COLOR = new ColorRGBA(0.38f, 0.20f, 0.05f, 1f); // ── Zustand ─────────────────────────────────────────────────────────────── - private Camera cam; + private final TerrainChunkState terrainChunkState; private AssetManager assetManager; private Node grassNode; private Material material; @@ -59,12 +60,16 @@ public class GrassVertexRenderState extends BaseAppState { private final List[] chunkBlades = new List[CHUNK_COUNT]; private final Node[] chunkNodes = new Node[CHUNK_COUNT]; + public GrassVertexRenderState(TerrainChunkState terrainChunkState) { + this.terrainChunkState = terrainChunkState; + } + @Override protected void initialize(Application app) { - this.cam = app.getCamera(); this.assetManager = app.getAssetManager(); grassNode = new Node("grassVertexNode"); ((SimpleApplication) app).getRootNode().attachChild(grassNode); + terrainChunkState.addChunkListener(this); for (int i = 0; i < CHUNK_COUNT; i++) chunkBlades[i] = new ArrayList<>(); @@ -82,6 +87,7 @@ public class GrassVertexRenderState extends BaseAppState { @Override protected void cleanup(Application app) { + terrainChunkState.removeChunkListener(this); ((SimpleApplication) app).getRootNode().detachChild(grassNode); } @@ -158,18 +164,35 @@ public class GrassVertexRenderState extends BaseAppState { Geometry geo = new Geometry("gv_" + ci, mesh); geo.setMaterial(material); - int cx = ci % CHUNKS_PER_AXIS; - int cz = ci / CHUNKS_PER_AXIS; - float chunkCX = -TERRAIN_HALF + cx * CHUNK_SIZE + CHUNK_SIZE * 0.5f; - float chunkCZ = -TERRAIN_HALF + cz * CHUNK_SIZE + CHUNK_SIZE * 0.5f; - Node node = new Node("gvc_" + ci); node.attachChild(geo); - node.addControl(new VisibilityControl(cam, new Vector3f(chunkCX, 0f, chunkCZ))); chunkNodes[ci] = node; grassNode.attachChild(node); } + // ── ChunkListener: Gras ab LOD 1 ausblenden ─────────────────────────────── + + @Override + public void onChunkVisible(int cx, int cz, int lod) { + setChunkVisible(cx, cz, lod == 0); + } + + @Override + public void onChunkHidden(int cx, int cz) { + setChunkVisible(cx, cz, false); + } + + @Override + public void onChunkLodChanged(int cx, int cz, int oldLod, int newLod) { + setChunkVisible(cx, cz, newLod == 0); + } + + private void setChunkVisible(int cx, int cz, boolean visible) { + int ci = cz * CHUNKS_PER_AXIS + cx; + if (ci < 0 || ci >= CHUNK_COUNT || chunkNodes[ci] == null) return; + chunkNodes[ci].setCullHint(visible ? Spatial.CullHint.Inherit : Spatial.CullHint.Always); + } + // ── Mesh-Logik (gespiegelt zu GrassVertexState) ─────────────────────────── private static void buildTuft(float[] pos, float[] nrm, float[] col, float[] tex, int[] idx, @@ -272,34 +295,26 @@ public class GrassVertexRenderState extends BaseAppState { float dr = DRY_ROOT_COLOR.r + (DRY_TIP_COLOR.r - DRY_ROOT_COLOR.r) * wf; float dg = DRY_ROOT_COLOR.g + (DRY_TIP_COLOR.g - DRY_ROOT_COLOR.g) * wf; float db = DRY_ROOT_COLOR.b + (DRY_TIP_COLOR.b - DRY_ROOT_COLOR.b) * wf; - col[ci] = gr + (dr - gr) * dryness; - col[ci+1] = gg + (dg - gg) * dryness; - col[ci+2] = gb + (db - gb) * dryness; - col[ci+3] = 1f; + float vr = VERY_DRY_ROOT_COLOR.r + (VERY_DRY_TIP_COLOR.r - VERY_DRY_ROOT_COLOR.r) * wf; + float vg = VERY_DRY_ROOT_COLOR.g + (VERY_DRY_TIP_COLOR.g - VERY_DRY_ROOT_COLOR.g) * wf; + float vb = VERY_DRY_ROOT_COLOR.b + (VERY_DRY_TIP_COLOR.b - VERY_DRY_ROOT_COLOR.b) * wf; + // Zwei-Segment-Gradient: 0→0.5 = grün→goldgelb, 0.5→1.0 = goldgelb→dunkelbraun + float fr, fg, fb; + if (dryness <= 0.5f) { + float t = dryness * 2f; + fr = gr + (dr - gr) * t; + fg = gg + (dg - gg) * t; + fb = gb + (db - gb) * t; + } else { + float t = (dryness - 0.5f) * 2f; + fr = dr + (vr - dr) * t; + fg = dg + (vg - dg) * t; + fb = db + (vb - db) * t; + } + col[ci] = fr; col[ci+1] = fg; col[ci+2] = fb; col[ci+3] = 1f; int ti = vi * 2; tex[ti] = wf; tex[ti+1] = 0f; } - // ── LOD-Culling ─────────────────────────────────────────────────────────── - - private static final class VisibilityControl extends AbstractControl { - private final Camera cam; - private final Vector3f center; - - VisibilityControl(Camera cam, Vector3f center) { - this.cam = cam; - this.center = center; - } - - @Override - protected void controlUpdate(float tpf) { - float dx = cam.getLocation().x - center.x; - float dz = cam.getLocation().z - center.z; - spatial.setCullHint(dx*dx + dz*dz <= FAR_DIST_SQ - ? Spatial.CullHint.Inherit : Spatial.CullHint.Always); - } - - @Override protected void controlRender(RenderManager rm, ViewPort vp) {} - } } diff --git a/blight-game/src/main/java/de/blight/game/state/InteractionHudState.java b/blight-game/src/main/java/de/blight/game/state/InteractionHudState.java new file mode 100644 index 0000000..5c56f67 --- /dev/null +++ b/blight-game/src/main/java/de/blight/game/state/InteractionHudState.java @@ -0,0 +1,135 @@ +package de.blight.game.state; + +import com.jme3.app.Application; +import com.jme3.app.SimpleApplication; +import com.jme3.app.state.BaseAppState; +import com.jme3.font.BitmapFont; +import com.jme3.font.BitmapText; +import com.jme3.math.ColorRGBA; +import com.jme3.math.Vector2f; +import com.jme3.math.Vector3f; +import com.jme3.renderer.Camera; +import com.jme3.scene.Node; +import com.jme3.scene.Spatial; +import de.blight.common.model.Item; +import de.blight.common.model.TextRegistry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Zeigt oberhalb von nahegelegenen Item-Pickups den Namen an, + * wenn der Spieler darauf zielt. + */ +public class InteractionHudState extends BaseAppState { + + private static final Logger log = LoggerFactory.getLogger(InteractionHudState.class); + + private static final float SHOW_RANGE = 3.5f; + private static final float DOT_THRESH = 0.65f; + private static final float Y_OFFSET = 0.6f; + + private Camera cam; + private Node guiNode; + private WorldItemsState worldItems; + + private BitmapText labelText; + + // ── Lifecycle ───────────────────────────────────────────────────────────── + + @Override + protected void initialize(Application app) { + SimpleApplication sapp = (SimpleApplication) app; + this.cam = app.getCamera(); + this.guiNode = sapp.getGuiNode(); + + BitmapFont font = app.getAssetManager().loadFont("Interface/Fonts/Default.fnt"); + labelText = new BitmapText(font, false); + labelText.setSize(font.getCharSet().getRenderedSize() * 1.2f); + labelText.setColor(new ColorRGBA(1f, 0.95f, 0.6f, 1f)); + labelText.setCullHint(Spatial.CullHint.Always); + guiNode.attachChild(labelText); + } + + @Override + protected void onEnable() { + worldItems = getStateManager().getState(WorldItemsState.class); + if (worldItems == null) + log.warn("[InteractionHud] WorldItemsState nicht gefunden."); + } + + @Override + protected void onDisable() { + labelText.setCullHint(Spatial.CullHint.Always); + } + + @Override + protected void cleanup(Application app) { + guiNode.detachChild(labelText); + } + + // ── Update ──────────────────────────────────────────────────────────────── + + @Override + public void update(float tpf) { + if (worldItems == null) { + labelText.setCullHint(Spatial.CullHint.Always); + return; + } + + Node itemsRoot = worldItems.getItemsRoot(); + if (itemsRoot == null || itemsRoot.getQuantity() == 0) { + labelText.setCullHint(Spatial.CullHint.Always); + return; + } + + Vector3f playerPos = worldItems.getPhysicsChar() != null + ? worldItems.getPhysicsChar().getPhysicsLocation() + : cam.getLocation(); + Vector3f camDir = cam.getDirection().normalizeLocal(); + + Spatial bestTarget = null; + float bestDot = -1f; + + for (Spatial s : itemsRoot.getChildren()) { + Vector3f itemPos = s.getWorldTranslation(); + float dx = itemPos.x - playerPos.x; + float dz = itemPos.z - playerPos.z; + float dist = (float) Math.sqrt(dx * dx + dz * dz); + if (dist > SHOW_RANGE) continue; + + Vector3f toItem = itemPos.subtract(cam.getLocation()).normalizeLocal(); + float dot = camDir.dot(toItem); + if (dot > DOT_THRESH && dot > bestDot) { + bestDot = dot; + bestTarget = s; + } + } + + if (bestTarget == null) { + labelText.setCullHint(Spatial.CullHint.Always); + return; + } + + String label = resolveLabel(bestTarget); + labelText.setText(label); + + Vector3f worldPos = bestTarget.getWorldTranslation().add(0f, Y_OFFSET, 0f); + Vector3f screenV3 = cam.getScreenCoordinates(worldPos); + Vector2f screen = new Vector2f(screenV3.x, screenV3.y); + + float textW = labelText.getLineWidth(); + labelText.setLocalTranslation(screen.x - textW * 0.5f, screen.y, 1f); + labelText.setCullHint(Spatial.CullHint.Inherit); + } + + // ── Hilfsmethoden ──────────────────────────────────────────────────────── + + private String resolveLabel(Spatial s) { + String itemId = s.getUserData("itemId"); + if (itemId == null) return "?"; + WorldItemsState state = worldItems; + // Resolve via TextRegistry if a full Item definition is available + // For now fall back to itemId + return itemId; + } +} diff --git a/blight-game/src/main/java/de/blight/game/state/ModelLodControl.java b/blight-game/src/main/java/de/blight/game/state/ModelLodControl.java new file mode 100644 index 0000000..23f9e11 --- /dev/null +++ b/blight-game/src/main/java/de/blight/game/state/ModelLodControl.java @@ -0,0 +1,121 @@ +package de.blight.game.state; + +import com.jme3.asset.AssetManager; +import com.jme3.renderer.RenderManager; +import com.jme3.renderer.ViewPort; +import com.jme3.renderer.Camera; +import com.jme3.scene.Node; +import com.jme3.scene.Spatial; +import com.jme3.scene.control.AbstractControl; + +/** + * Wechselt zwischen Main-Model, LOD1, LOD2 und Ausblenden basierend auf Kameradistanz. + * + * Struktur des kontrollierten Node: + * [0] = Haupt-Spatial (LOD0) + * [1] = LOD1-Spatial (wird lazy geladen, wenn lod1Path gesetzt) + * [2] = LOD2-Spatial (wird lazy geladen, wenn lod2Path gesetzt) + */ +public class ModelLodControl extends AbstractControl { + + private final AssetManager assets; + private final String lod1Path; + private final String lod2Path; + private final float lod1DistSq; + private final float lod2DistSq; + private final float cullDistSq; + + private boolean lod1Loaded = false; + private boolean lod2Loaded = false; + private int currentSlot = 0; // 0=main, 1=lod1, 2=lod2, -1=culled + + public ModelLodControl(AssetManager assets, + String lod1Path, String lod2Path, + float lod1Distance, float lod2Distance, float cullDistance) { + this.assets = assets; + this.lod1Path = (lod1Path != null && !lod1Path.isBlank()) ? lod1Path : null; + this.lod2Path = (lod2Path != null && !lod2Path.isBlank()) ? lod2Path : null; + this.lod1DistSq = lod1Distance * lod1Distance; + this.lod2DistSq = lod2Distance * lod2Distance; + this.cullDistSq = cullDistance * cullDistance; + } + + @Override + protected void controlUpdate(float tpf) { + if (!(spatial instanceof Node node)) return; + Camera cam = null; + // walk up to get the app's camera via the scene + // We use the ViewPort supplied during render; cache camera via controlRender instead. + // Nothing to do here without camera ref — logic moved to controlRender. + } + + @Override + protected void controlRender(RenderManager rm, ViewPort vp) { + if (!(spatial instanceof Node node)) return; + Camera cam = vp.getCamera(); + + float dx = cam.getLocation().x - spatial.getWorldTranslation().x; + float dy = cam.getLocation().y - spatial.getWorldTranslation().y; + float dz = cam.getLocation().z - spatial.getWorldTranslation().z; + float distSq = dx*dx + dy*dy + dz*dz; + + int targetSlot; + if (distSq >= cullDistSq) { + targetSlot = -1; + } else if (lod2Path != null && distSq >= lod2DistSq) { + targetSlot = 2; + } else if (lod1Path != null && distSq >= lod1DistSq) { + targetSlot = 1; + } else { + targetSlot = 0; + } + + if (targetSlot == currentSlot) return; + currentSlot = targetSlot; + + // Ensure LOD spatials are loaded + if (targetSlot == 1 && !lod1Loaded) { + lod1Loaded = true; + try { + Spatial lod1 = assets.loadModel(lod1Path); + lod1.setName("lod1"); + node.attachChildAt(lod1, 1); + } catch (Exception e) { + // LOD1 load failed — fall back to main + currentSlot = 0; + targetSlot = 0; + } + } + if (targetSlot == 2 && !lod2Loaded) { + lod2Loaded = true; + try { + Spatial lod2 = assets.loadModel(lod2Path); + lod2.setName("lod2"); + // ensure index 2 exists + if (node.getChildren().size() < 2 && lod1Path != null && !lod1Loaded) { + // lod1 slot not yet loaded — add placeholder to maintain index + Node placeholder = new Node("lod1_placeholder"); + node.attachChild(placeholder); + } + node.attachChild(lod2); + } catch (Exception e) { + currentSlot = lod1Path != null ? 1 : 0; + targetSlot = currentSlot; + } + } + + // Apply visibility: cull hint on node itself for -1, else show correct child + if (targetSlot == -1) { + spatial.setCullHint(Spatial.CullHint.Always); + return; + } + spatial.setCullHint(Spatial.CullHint.Dynamic); + + for (int i = 0; i < node.getChildren().size(); i++) { + Spatial child = node.getChildren().get(i); + child.setCullHint(i == targetSlot + ? Spatial.CullHint.Dynamic + : Spatial.CullHint.Always); + } + } +} diff --git a/blight-game/src/main/java/de/blight/game/state/TerrainChunkState.java b/blight-game/src/main/java/de/blight/game/state/TerrainChunkState.java new file mode 100644 index 0000000..ae46365 --- /dev/null +++ b/blight-game/src/main/java/de/blight/game/state/TerrainChunkState.java @@ -0,0 +1,381 @@ +package de.blight.game.state; + +import com.jme3.app.Application; +import com.jme3.app.SimpleApplication; +import com.jme3.app.state.BaseAppState; +import com.jme3.bullet.BulletAppState; +import com.jme3.bullet.collision.shapes.HeightfieldCollisionShape; +import com.jme3.bullet.control.RigidBodyControl; +import com.jme3.material.Material; +import com.jme3.math.Vector3f; +import com.jme3.renderer.Camera; +import com.jme3.renderer.queue.RenderQueue; +import com.jme3.scene.Geometry; +import com.jme3.scene.Mesh; +import com.jme3.scene.Node; +import com.jme3.scene.VertexBuffer; +import com.jme3.util.BufferUtils; +import de.blight.common.ChunkTerrainIO; +import de.blight.common.MapData; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * Verwaltet das chunk-basierte LOD-Terrain im Spiel. + * + * 1024 Chunks à 128×128 m, jeweils 3 LOD-Stufen (1/4/16 m pro Vertex). + * LOD richtet sich nach Chebyshev-Distanz zum Spieler-Chunk. + * Physik-Collider (HeightfieldCollisionShape, native 129²-Auflösung) werden + * nur für Chunks innerhalb PHYSICS_RANGE gehalten. + * + * Registrierte {@link ChunkListener} werden über LOD-Wechsel informiert + * (z. B. GrassVertexRenderState versteckt Gras ab LOD 1). + */ +public class TerrainChunkState extends BaseAppState { + + // ── Listener-Interface ──────────────────────────────────────────────────── + + public interface ChunkListener { + void onChunkVisible(int cx, int cz, int lod); + void onChunkHidden(int cx, int cz); + void onChunkLodChanged(int cx, int cz, int oldLod, int newLod); + } + + // ── Konstanten ──────────────────────────────────────────────────────────── + + private static final int N = ChunkTerrainIO.CHUNKS_PER_AXIS; // 32 + private static final int TOTAL = ChunkTerrainIO.CHUNK_COUNT; // 1024 + + // ── Eingabe ─────────────────────────────────────────────────────────────── + + private final BulletAppState bulletAppState; + private final Material terrainMaterial; + private final MapData mapData; + + // ── Laufzeitstatus ──────────────────────────────────────────────────────── + + private SimpleApplication app; + private Camera cam; + private Node terrainRoot; + + private final float[][] chunkHeights = new float[TOTAL][]; + private final int[] chunkLod = new int[TOTAL]; + private final Node[] chunkNodes = new Node[TOTAL]; + private final RigidBodyControl[] physics = new RigidBodyControl[TOTAL]; + private final List listeners = new ArrayList<>(); + + private int lastPlayerCx = Integer.MIN_VALUE; + private int lastPlayerCz = Integer.MIN_VALUE; + + // ── Konstruktor ─────────────────────────────────────────────────────────── + + public TerrainChunkState(BulletAppState bulletAppState, Material terrainMaterial, MapData mapData) { + this.bulletAppState = bulletAppState; + this.terrainMaterial = terrainMaterial; + this.mapData = mapData; + } + + // ── Lifecycle ───────────────────────────────────────────────────────────── + + @Override + protected void initialize(Application app) { + this.app = (SimpleApplication) app; + this.cam = app.getCamera(); + Arrays.fill(chunkLod, -1); + + terrainRoot = new Node("terrainChunks"); + this.app.getRootNode().attachChild(terrainRoot); + + if (!ChunkTerrainIO.allChunksExist()) { + try { + if (mapData != null) + ChunkTerrainIO.exportFromMapData(mapData); + else + ChunkTerrainIO.exportBlankChunks(); + System.out.println("[TerrainChunkState] Chunk-Dateien erzeugt."); + } catch (IOException e) { + System.err.println("[TerrainChunkState] Chunk-Export fehlgeschlagen: " + e); + } + } + + for (int cz = 0; cz < N; cz++) { + for (int cx = 0; cx < N; cx++) { + int ci = ChunkTerrainIO.chunkIndex(cx, cz); + try { + chunkHeights[ci] = ChunkTerrainIO.loadChunk(cx, cz); + } catch (IOException e) { + chunkHeights[ci] = flatChunk(); + System.err.println("[TerrainChunkState] Chunk " + cx + "," + cz + " nicht ladbar: " + e.getMessage()); + } + } + } + System.out.println("[TerrainChunkState] " + TOTAL + " Chunks geladen."); + } + + @Override + protected void cleanup(Application app) { + for (int ci = 0; ci < TOTAL; ci++) removePhysics(ci); + ((SimpleApplication) app).getRootNode().detachChild(terrainRoot); + } + + @Override protected void onEnable() {} + @Override protected void onDisable() {} + + // ── Update: LOD + Physik ────────────────────────────────────────────────── + + @Override + public void update(float tpf) { + Vector3f camPos = cam.getLocation(); + int pcx = worldToChunk(camPos.x); + int pcz = worldToChunk(camPos.z); + + if (pcx == lastPlayerCx && pcz == lastPlayerCz) return; + lastPlayerCx = pcx; + lastPlayerCz = pcz; + + // Ziel-LOD für alle Chunks berechnen + int[] targetLod = new int[TOTAL]; + boolean[] dirty = new boolean[TOTAL]; + for (int cz = 0; cz < N; cz++) { + for (int cx = 0; cx < N; cx++) { + int ci = ChunkTerrainIO.chunkIndex(cx, cz); + int dist = ChunkTerrainIO.chebyshev(cx, cz, pcx, pcz); + targetLod[ci] = ChunkTerrainIO.lodForDistance(dist); + dirty[ci] = targetLod[ci] != chunkLod[ci]; + } + } + + // Schmutzige Chunks + ihre Nachbarn neu bauen (Seam-Korrektheit) + boolean[] rebuildSet = dirty.clone(); + for (int cz = 0; cz < N; cz++) { + for (int cx = 0; cx < N; cx++) { + if (!dirty[ChunkTerrainIO.chunkIndex(cx, cz)]) continue; + if (cx > 0) rebuildSet[ChunkTerrainIO.chunkIndex(cx-1, cz)] = true; + if (cx < N-1) rebuildSet[ChunkTerrainIO.chunkIndex(cx+1, cz)] = true; + if (cz > 0) rebuildSet[ChunkTerrainIO.chunkIndex(cx, cz-1)] = true; + if (cz < N-1) rebuildSet[ChunkTerrainIO.chunkIndex(cx, cz+1)] = true; + } + } + + for (int cz = 0; cz < N; cz++) { + for (int cx = 0; cx < N; cx++) { + int ci = ChunkTerrainIO.chunkIndex(cx, cz); + if (!rebuildSet[ci]) continue; + + int oldLod = chunkLod[ci]; + int newLod = targetLod[ci]; + + rebuildChunkMesh(cx, cz, newLod, targetLod); + + // Physik: nur für nahe Chunks halten + int dist = ChunkTerrainIO.chebyshev(cx, cz, pcx, pcz); + boolean wantsPhysics = dist <= ChunkTerrainIO.PHYSICS_RANGE; + if (wantsPhysics && physics[ci] == null) addPhysics(ci); + if (!wantsPhysics && physics[ci] != null) removePhysics(ci); + + // Listener benachrichtigen + if (oldLod < 0) { + notifyVisible(cx, cz, newLod); + } else if (newLod != oldLod) { + notifyLodChanged(cx, cz, oldLod, newLod); + } + } + } + } + + // ── Öffentliche API ─────────────────────────────────────────────────────── + + /** Bilinear interpolierte Terrain-Höhe an einer Welt-XZ-Position. */ + public float getHeightAt(float worldX, float worldZ) { + int cx = Math.max(0, Math.min(N-1, worldToChunk(worldX))); + int cz = Math.max(0, Math.min(N-1, worldToChunk(worldZ))); + float[] h = chunkHeights[ChunkTerrainIO.chunkIndex(cx, cz)]; + if (h == null) return 1f; + + float originX = -2048f + cx * ChunkTerrainIO.CHUNK_SIZE; + float originZ = -2048f + cz * ChunkTerrainIO.CHUNK_SIZE; + float fx = Math.max(0, Math.min(ChunkTerrainIO.CHUNK_SIZE, worldX - originX)); + float fz = Math.max(0, Math.min(ChunkTerrainIO.CHUNK_SIZE, worldZ - originZ)); + + int V = ChunkTerrainIO.CHUNK_VERTS; // 129 + int col0 = Math.min((int) fx, V - 2); + int row0 = Math.min((int) fz, V - 2); + float tx = fx - col0; + float tz = fz - row0; + + float h00 = h[row0 * V + col0]; + float h10 = h[row0 * V + col0 + 1]; + float h01 = h[(row0 + 1) * V + col0]; + float h11 = h[(row0 + 1) * V + col0 + 1]; + return h00 * (1-tx)*(1-tz) + h10 * tx*(1-tz) + h01 * (1-tx)*tz + h11 * tx*tz; + } + + public void addChunkListener(ChunkListener l) { listeners.add(l); } + public void removeChunkListener(ChunkListener l) { listeners.remove(l); } + + // ── Chunk-Mesh-Aufbau ───────────────────────────────────────────────────── + + private void rebuildChunkMesh(int cx, int cz, int lod, int[] targetLod) { + int ci = ChunkTerrainIO.chunkIndex(cx, cz); + + // Knoten anlegen oder altes Mesh entfernen + if (chunkNodes[ci] == null) { + float nx = -2048f + cx * ChunkTerrainIO.CHUNK_SIZE + 64f; + float nz = -2048f + cz * ChunkTerrainIO.CHUNK_SIZE + 64f; + Node node = new Node("tn_" + cx + "_" + cz); + node.setLocalTranslation(nx, 0f, nz); + chunkNodes[ci] = node; + terrainRoot.attachChild(node); + } else { + chunkNodes[ci].detachAllChildren(); + } + + int verts = ChunkTerrainIO.LOD_VERTS[lod]; + float spacing = ChunkTerrainIO.LOD_SPACING[lod]; + + float[] lodH = ChunkTerrainIO.downsample(chunkHeights[ci], ChunkTerrainIO.CHUNK_VERTS, verts); + applySeams(cx, cz, lod, lodH, verts, targetLod); + + Mesh mesh = buildMesh(cx, cz, lodH, verts, spacing); + + Geometry geom = new Geometry("tc_" + cx + "_" + cz, mesh); + geom.setMaterial(terrainMaterial); + geom.setShadowMode(RenderQueue.ShadowMode.Receive); + chunkNodes[ci].attachChild(geom); + + chunkLod[ci] = lod; + } + + private void applySeams(int cx, int cz, int lod, float[] lodH, int verts, int[] targetLod) { + int[] dxArr = { 0, 0, 1, -1 }; + int[] dzArr = { 1, -1, 0, 0 }; + int[] thisEdges = { ChunkTerrainIO.EDGE_NORTH, ChunkTerrainIO.EDGE_SOUTH, + ChunkTerrainIO.EDGE_EAST, ChunkTerrainIO.EDGE_WEST }; + int[] neighborEdge = { ChunkTerrainIO.EDGE_SOUTH, ChunkTerrainIO.EDGE_NORTH, + ChunkTerrainIO.EDGE_WEST, ChunkTerrainIO.EDGE_EAST }; + + for (int e = 0; e < 4; e++) { + int ncx = cx + dxArr[e]; + int ncz = cz + dzArr[e]; + if (ncx < 0 || ncx >= N || ncz < 0 || ncz >= N) continue; + int nci = ChunkTerrainIO.chunkIndex(ncx, ncz); + int neighborLod = targetLod[nci] < 0 ? 0 : targetLod[nci]; + if (neighborLod <= lod || chunkHeights[nci] == null) continue; + + int nVerts = ChunkTerrainIO.LOD_VERTS[neighborLod]; + float[] nLodH = ChunkTerrainIO.downsample(chunkHeights[nci], ChunkTerrainIO.CHUNK_VERTS, nVerts); + float[] nEdgeVals = ChunkTerrainIO.extractEdge(nLodH, nVerts, neighborEdge[e]); + ChunkTerrainIO.stitchEdge(lodH, verts, nEdgeVals, nVerts, thisEdges[e]); + } + } + + private static Mesh buildMesh(int cx, int cz, float[] lodH, int verts, float spacing) { + float chunkCX = -2048f + cx * ChunkTerrainIO.CHUNK_SIZE + 64f; + float chunkCZ = -2048f + cz * ChunkTerrainIO.CHUNK_SIZE + 64f; + float half = (verts - 1) * spacing * 0.5f; // immer 64 m + + int vertCount = verts * verts; + int indexCount = (verts - 1) * (verts - 1) * 6; + + float[] positions = new float[vertCount * 3]; + float[] normals = new float[vertCount * 3]; + float[] texCoords = new float[vertCount * 2]; + int[] indices = new int[indexCount]; + + for (int row = 0; row < verts; row++) { + for (int col = 0; col < verts; col++) { + int vi = row * verts + col; + float lx = col * spacing - half; + float lz = row * spacing - half; + float h = lodH[vi]; + + int pi = vi * 3; + positions[pi] = lx; positions[pi+1] = h; positions[pi+2] = lz; + + // Normale per zentrale Differenzen + float hL = lodH[row * verts + Math.max(0, col-1)]; + float hR = lodH[row * verts + Math.min(verts-1, col+1)]; + float hD = lodH[Math.max(0, row-1) * verts + col]; + float hU = lodH[Math.min(verts-1, row+1) * verts + col]; + float nx = -(hR - hL); + float ny = 2f * spacing; + float nz = -(hU - hD); + float nLen = (float) Math.sqrt(nx*nx + ny*ny + nz*nz); + if (nLen > 1e-6f) { nx /= nLen; ny /= nLen; nz /= nLen; } + normals[pi] = nx; normals[pi+1] = ny; normals[pi+2] = nz; + + // Welt-Raum UV (0–1 über 4096 m) für globale Splat-Map + float worldX = chunkCX + lx; + float worldZ = chunkCZ + lz; + int ti = vi * 2; + texCoords[ti] = (worldX + 2048f) / 4096f; + texCoords[ti+1] = (worldZ + 2048f) / 4096f; + } + } + + int ii = 0; + for (int row = 0; row < verts - 1; row++) { + for (int col = 0; col < verts - 1; col++) { + int v00 = row * verts + col; + int v10 = v00 + 1; + int v01 = v00 + verts; + int v11 = v01 + 1; + indices[ii++] = v00; indices[ii++] = v01; indices[ii++] = v10; + indices[ii++] = v10; indices[ii++] = v01; indices[ii++] = v11; + } + } + + Mesh mesh = new Mesh(); + mesh.setBuffer(VertexBuffer.Type.Position, 3, BufferUtils.createFloatBuffer(positions)); + mesh.setBuffer(VertexBuffer.Type.Normal, 3, BufferUtils.createFloatBuffer(normals)); + mesh.setBuffer(VertexBuffer.Type.TexCoord, 2, BufferUtils.createFloatBuffer(texCoords)); + mesh.setBuffer(VertexBuffer.Type.Index, 3, BufferUtils.createIntBuffer(indices)); + mesh.updateBound(); + mesh.updateCounts(); + return mesh; + } + + // ── Physik ──────────────────────────────────────────────────────────────── + + private void addPhysics(int ci) { + if (chunkNodes[ci] == null || chunkHeights[ci] == null) return; + HeightfieldCollisionShape shape = new HeightfieldCollisionShape( + chunkHeights[ci], new Vector3f(1f, 1f, 1f)); + RigidBodyControl rbc = new RigidBodyControl(shape, 0f); + chunkNodes[ci].addControl(rbc); + bulletAppState.getPhysicsSpace().add(rbc); + physics[ci] = rbc; + } + + private void removePhysics(int ci) { + if (physics[ci] == null) return; + bulletAppState.getPhysicsSpace().remove(physics[ci]); + if (chunkNodes[ci] != null) chunkNodes[ci].removeControl(physics[ci]); + physics[ci] = null; + } + + // ── Listener ───────────────────────────────────────────────────────────── + + private void notifyVisible(int cx, int cz, int lod) { + for (ChunkListener l : listeners) l.onChunkVisible(cx, cz, lod); + } + + private void notifyLodChanged(int cx, int cz, int oldLod, int newLod) { + for (ChunkListener l : listeners) l.onChunkLodChanged(cx, cz, oldLod, newLod); + } + + // ── Hilfsmethoden ──────────────────────────────────────────────────────── + + private static int worldToChunk(float world) { + return Math.max(0, Math.min(N - 1, (int) ((world + 2048f) / ChunkTerrainIO.CHUNK_SIZE))); + } + + private static float[] flatChunk() { + float[] h = new float[ChunkTerrainIO.CHUNK_VERTS * ChunkTerrainIO.CHUNK_VERTS]; + Arrays.fill(h, 1f); + return h; + } +} diff --git a/blight-game/src/main/java/de/blight/game/state/WorldItemsState.java b/blight-game/src/main/java/de/blight/game/state/WorldItemsState.java new file mode 100644 index 0000000..043c778 --- /dev/null +++ b/blight-game/src/main/java/de/blight/game/state/WorldItemsState.java @@ -0,0 +1,230 @@ +package de.blight.game.state; + +import com.jme3.app.Application; +import com.jme3.app.SimpleApplication; +import com.jme3.app.state.BaseAppState; +import com.jme3.asset.AssetManager; +import com.jme3.asset.plugins.FileLocator; +import com.jme3.bullet.control.CharacterControl; +import com.jme3.input.InputManager; +import com.jme3.input.controls.ActionListener; +import com.jme3.input.controls.KeyTrigger; +import com.jme3.material.Material; +import com.jme3.math.ColorRGBA; +import com.jme3.math.FastMath; +import com.jme3.math.Quaternion; +import com.jme3.math.Vector3f; +import com.jme3.scene.Geometry; +import com.jme3.scene.Node; +import com.jme3.scene.Spatial; +import com.jme3.scene.shape.Box; +import de.blight.common.PlacedItem; +import de.blight.common.PlacedItemIO; +import de.blight.common.model.Inventar; +import de.blight.common.model.Item; +import de.blight.common.model.ItemIO; +import de.blight.common.model.MainCharacter; +import de.blight.game.animation.AnimationLibrary; +import de.blight.game.config.KeyBindings; +import de.blight.game.control.PlayerInputControl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Lädt alle auf der Karte platzierten Items, stellt sie als 3D-Objekte dar und + * verarbeitet das Aufheben (E-Taste) mit PICK_UP-Animation. + */ +public class WorldItemsState extends BaseAppState { + + private static final Logger log = LoggerFactory.getLogger(WorldItemsState.class); + + private static final float PICKUP_RANGE = 2.5f; + private static final float PICKUP_ANIM_DURATION = 0.8f; + private static final String INTERACT_ACTION = "Interact"; + + private final KeyBindings keyBindings; + private final CharacterControl physicsChar; + private final MainCharacter mainCharacter; + private final PlayerInputControl playerInput; + + private SimpleApplication app; + private AssetManager assets; + private InputManager inputManager; + private Node rootNode; + private Node itemsRoot; + + private final List items = new ArrayList<>(); + private final List visuals = new ArrayList<>(); + private final Map itemDefs = new HashMap<>(); + + private final Quaternion rotQuat = new Quaternion(); + private float rotAccum = 0f; + + public WorldItemsState(KeyBindings keyBindings, CharacterControl physicsChar, + MainCharacter mainCharacter, PlayerInputControl playerInput) { + this.keyBindings = keyBindings; + this.physicsChar = physicsChar; + this.mainCharacter = mainCharacter; + this.playerInput = playerInput; + } + + // ── Lifecycle ───────────────────────────────────────────────────────────── + + @Override + protected void initialize(Application app) { + this.app = (SimpleApplication) app; + this.assets = app.getAssetManager(); + this.inputManager = app.getInputManager(); + this.rootNode = this.app.getRootNode(); + this.itemsRoot = new Node("worldItemsRoot"); + + try { + assets.registerLocator( + AnimationLibrary.findAssetRoot().toAbsolutePath().toString(), + FileLocator.class); + } catch (Exception ignored) {} + + Path itemDir = AnimationLibrary.findAssetRoot().resolve("items"); + for (Item it : ItemIO.loadAll(itemDir)) { + if (it.getItemId() != null) itemDefs.put(it.getItemId(), it); + } + log.info("[WorldItems] {} Item-Definitionen geladen.", itemDefs.size()); + } + + @Override + protected void onEnable() { + items.clear(); + visuals.clear(); + try { + items.addAll(PlacedItemIO.load()); + } catch (Exception e) { + log.warn("[WorldItems] Laden fehlgeschlagen: {}", e.getMessage()); + } + + for (PlacedItem pi : items) { + Spatial s = buildVisual(pi); + s.setLocalTranslation(pi.x(), pi.y() + 0.25f, pi.z()); + s.setUserData("itemId", pi.itemId()); + itemsRoot.attachChild(s); + visuals.add(s); + } + rootNode.attachChild(itemsRoot); + log.info("[WorldItems] {} Item-Pickups geladen.", items.size()); + + inputManager.addMapping(INTERACT_ACTION, new KeyTrigger(keyBindings.interact)); + inputManager.addListener(interactListener, INTERACT_ACTION); + } + + @Override + protected void onDisable() { + itemsRoot.detachAllChildren(); + itemsRoot.removeFromParent(); + visuals.clear(); + items.clear(); + inputManager.removeListener(interactListener); + try { inputManager.deleteMapping(INTERACT_ACTION); } catch (Exception ignored) {} + } + + @Override + protected void cleanup(Application app) {} + + @Override + public void update(float tpf) { + if (visuals.isEmpty()) return; + rotAccum += tpf * 60f; + rotQuat.fromAngles(0f, rotAccum * FastMath.DEG_TO_RAD, 0f); + for (Spatial s : visuals) s.setLocalRotation(rotQuat); + } + + // ── Interaktion ─────────────────────────────────────────────────────────── + + private final ActionListener interactListener = (name, isPressed, tpf) -> { + if (isPressed) tryPickup(); + }; + + private void tryPickup() { + if (physicsChar == null || items.isEmpty()) return; + Vector3f playerPos = physicsChar.getPhysicsLocation(); + + int nearest = -1; + float bestDist = Float.MAX_VALUE; + for (int i = 0; i < items.size(); i++) { + PlacedItem pi = items.get(i); + float dx = pi.x() - playerPos.x; + float dz = pi.z() - playerPos.z; + float dist = (float) Math.sqrt(dx * dx + dz * dz); + if (dist < PICKUP_RANGE && dist < bestDist) { + bestDist = dist; + nearest = i; + } + } + if (nearest < 0) return; + + PlacedItem picked = items.get(nearest); + Spatial pickedSpatial = visuals.get(nearest); + pickedSpatial.removeFromParent(); + items.remove(nearest); + visuals.remove(nearest); + + // Kartendatei sofort aktualisieren + try { + PlacedItemIO.save(items); + } catch (IOException e) { + log.warn("[WorldItems] Speichern fehlgeschlagen: {}", e.getMessage()); + } + + // Ins Inventar legen + Item def = itemDefs.get(picked.itemId()); + if (mainCharacter != null) { + if (mainCharacter.getInventar() == null) { + mainCharacter.setInventar(new Inventar()); + } + if (def != null) { + mainCharacter.getInventar().collect(def); + log.info("[WorldItems] '{}' aufgehoben.", picked.itemId()); + } else { + log.warn("[WorldItems] Keine Item-Definition für '{}'.", picked.itemId()); + } + } + + // PICK_UP-Animation spielen und Bewegung sperren + if (playerInput != null) { + playerInput.requestPickup(PICKUP_ANIM_DURATION); + } + } + + // ── Zugriff ─────────────────────────────────────────────────────────────── + + public Node getItemsRoot() { return itemsRoot; } + public CharacterControl getPhysicsChar() { return physicsChar; } + + // ── Visuelles ───────────────────────────────────────────────────────────── + + private Spatial buildVisual(PlacedItem pi) { + Item def = itemDefs.get(pi.itemId()); + if (def != null && def.getModelRef() != null + && def.getModelRef().getPath() != null + && !def.getModelRef().getPath().isBlank()) { + try { + Spatial model = assets.loadModel(def.getModelRef().getPath()); + model.setName("item_" + pi.itemId()); + return model; + } catch (Exception e) { + log.warn("[WorldItems] Modell für '{}' nicht ladbar: {}", pi.itemId(), e.getMessage()); + } + } + // Fallback: goldener Würfel + Geometry g = new Geometry("item_" + pi.itemId(), new Box(0.15f, 0.15f, 0.15f)); + Material mat = new Material(assets, "Common/MatDefs/Misc/Unshaded.j3md"); + mat.setColor("Color", new ColorRGBA(1f, 0.82f, 0.1f, 1f)); + g.setMaterial(mat); + return g; + } +} diff --git a/blight-game/src/main/java/de/blight/game/state/WorldObjectsState.java b/blight-game/src/main/java/de/blight/game/state/WorldObjectsState.java index d601e1e..6ce024e 100644 --- a/blight-game/src/main/java/de/blight/game/state/WorldObjectsState.java +++ b/blight-game/src/main/java/de/blight/game/state/WorldObjectsState.java @@ -115,6 +115,19 @@ public class WorldObjectsState extends BaseAppState { spatial = assets.loadModel(path); } spatial.setName("obj_" + path); + + // LOD / Distance-Culling + if (m.cullDistance() > 0f) { + Node lodRoot = new Node("lodRoot_" + path); + lodRoot.attachChild(spatial); + ModelLodControl ctrl = new ModelLodControl( + assets, + m.lod1Path(), m.lod2Path(), + m.lod1Distance(), m.lod2Distance(), m.cullDistance()); + lodRoot.addControl(ctrl); + return lodRoot; + } + return spatial; } diff --git a/blight-map/src/main/map/blight_ferns.blf b/blight-map/src/main/map/blight_ferns.blf new file mode 100644 index 0000000..35513b9 Binary files /dev/null and b/blight-map/src/main/map/blight_ferns.blf differ diff --git a/blight-map/src/main/map/blight_grass.blg b/blight-map/src/main/map/blight_grass.blg index 7141e82..d2f7e9a 100644 Binary files a/blight-map/src/main/map/blight_grass.blg and b/blight-map/src/main/map/blight_grass.blg differ diff --git a/blight-map/src/main/map/blight_grass_vertex.blgv b/blight-map/src/main/map/blight_grass_vertex.blgv index 60e7fd7..1274c73 100644 Binary files a/blight-map/src/main/map/blight_grass_vertex.blgv and b/blight-map/src/main/map/blight_grass_vertex.blgv differ diff --git a/blight-map/src/main/map/blight_map.blm b/blight-map/src/main/map/blight_map.blm index 8deed5b..c50f5b8 100644 Binary files a/blight-map/src/main/map/blight_map.blm and b/blight-map/src/main/map/blight_map.blm differ diff --git a/blight-map/src/main/map/blight_objects.blo b/blight-map/src/main/map/blight_objects.blo index cf9e202..9a3f07f 100644 --- a/blight-map/src/main/map/blight_objects.blo +++ b/blight-map/src/main/map/blight_objects.blo @@ -1,31 +1,45 @@ -# modelPath x y z rotY scale rotX rotZ solid texPath nmPath matPath meshFile animClip castShadow receiveShadow -Models/Palm_Palme1_20260524_153405.j3o -74.09265 8.19780 -18.47723 0.00000 1.00000 0.00000 0.00000 false true true -Models/Palm_Palme1_20260524_153421.j3o -59.20779 13.84631 -17.90553 0.00000 1.00000 0.00000 0.00000 false true true -Models/Palm_Palme1_20260524_153421.j3o -37.63680 32.63404 -18.65228 0.00000 1.00000 0.00000 0.00000 false true true -Models/Palm_Palme1_20260524_153421.j3o -15.66568 10.46379 -25.60722 0.00000 1.00000 0.00000 0.00000 false true true -@box -471.37857 22.27976 -91.47378 0.00000 1.00000 0.00000 0.00000 false Models/custom_mesh_0.j3o true true -@box -469.23279 22.49469 -91.51467 0.00000 1.00000 0.00000 0.00000 false Models/custom_mesh_1.j3o true true -@group -462.16046 3.59008 -122.32437 0.00000 1.00000 0.00000 0.00000 false Models/custom_mesh_2.j3o true true -Models/Palm_Palme1.j3o -245.90610 165.20883 99.17912 -6.43500 1.00000 0.00000 0.00000 false true true -Models/Palm_Palme1_20260522_075053.j3o -246.13976 166.24338 89.64748 0.00000 1.00000 0.00000 0.00000 false true true -Models/Palm_Palme1_20260522_075102.j3o -240.90959 166.65724 85.45869 0.00000 1.00000 0.00000 0.00000 false true true -Models/Palm_Palme1_20260522_075134.j3o -254.69368 165.64214 91.69685 0.00000 1.00000 0.00000 0.00000 false true true -Models/Palm_Palme1_20260522_075137.j3o -248.68674 167.64050 76.46214 0.00000 1.00000 0.00000 0.00000 false true true -Models/Palm_Palme1.j3o -205.20802 165.35493 88.46772 -18.77974 1.00000 0.00000 0.00000 false true true -Models/Palm_Palme1_20260522_075102.j3o -135.84702 158.69884 84.12026 0.00000 1.00000 0.00000 0.00000 false true true -@plane -224.78107 164.15782 108.96712 0.00000 1.00000 0.00000 0.00000 false Models/custom_mesh_3.j3o true true -@plane -220.53658 165.75740 108.73174 0.00000 1.00000 0.00000 0.00000 false Models/custom_mesh_4.j3o true true -@plane -237.96001 165.08000 113.44000 0.00000 1.00000 0.00000 0.00000 false Models/custom_mesh_5.j3o true true -@plane -235.81349 164.75165 114.21590 0.00000 1.00000 0.00000 0.00000 false Models/custom_mesh_6.j3o true true -Models/Tree/Tree.mesh.j3o -246.86934 164.83850 107.50585 0.00000 1.00000 0.00000 0.00000 false true true -Models/Boat/boat.j3o -261.74731 164.72397 120.62883 0.00000 1.00000 0.00000 0.00000 false true true -Models/Campfire.j3o -350.02148 164.72334 72.42865 0.00000 1.00000 0.00000 0.00000 false true true -Models/Campfire.j3o -67.93591 1.71510 -36.36593 0.00000 1.00000 0.00000 0.00000 false true true -Models/tree.j3o -28.09666 16.39296 -34.64375 0.00000 1.00000 0.00000 0.00000 false true true -Models/tree.j3o -83.04567 -2.69246 -39.34207 0.00000 1.00000 0.00000 0.00000 false true true -Models/Tree/Tree.mesh.j3o 295.18826 1.00000 189.92809 0.00000 1.00000 0.00000 0.00000 false true true -Models/gltf/duck/Duck.gltf 300.54111 1.00000 198.35368 0.00000 1.00000 0.00000 0.00000 false true true -Models/Buggy/Buggy.j3o 296.60590 1.00000 201.24153 0.00000 1.00000 0.00000 0.00000 false true true -Models/Jaime/Jaime.j3o 304.02374 1.00000 199.25398 0.00000 1.00000 0.00000 0.00000 false true true -Models/tree.j3o 221.98000 1.00000 130.25000 0.00000 1.00000 0.00000 0.00000 true true true -Models/Palm_Palme1_20260522_075134.j3o 240.61151 1.00000 97.48973 0.00000 1.00000 0.00000 0.00000 false true true +# modelPath x y z rotY scale rotX rotZ solid texPath nmPath matPath meshFile animClip castShadow receiveShadow lod1Path lod2Path lod1Distance lod2Distance cullDistance +Models/Palm_Palme1_20260524_153405.j3o -74.09265 8.19780 -18.47723 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/Palm_Palme1_20260524_153421.j3o -59.20779 13.84631 -17.90553 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/Palm_Palme1_20260524_153421.j3o -37.63680 32.63404 -18.65228 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/Palm_Palme1_20260524_153421.j3o -15.66568 10.46379 -25.60722 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +@box -471.37857 22.27976 -91.47378 0.00000 1.00000 0.00000 0.00000 false Models/custom_mesh_0.j3o true true 30.00000 80.00000 120.00000 +@box -469.23279 22.49469 -91.51467 0.00000 1.00000 0.00000 0.00000 false Models/custom_mesh_1.j3o true true 30.00000 80.00000 120.00000 +@group -462.16046 3.59008 -122.32437 0.00000 1.00000 0.00000 0.00000 false Models/custom_mesh_2.j3o true true 30.00000 80.00000 120.00000 +Models/Palm_Palme1.j3o -245.90610 165.20883 99.17912 -6.43500 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/Palm_Palme1_20260522_075053.j3o -246.13976 166.24338 89.64748 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/Palm_Palme1_20260522_075102.j3o -240.90959 166.65724 85.45869 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/Palm_Palme1_20260522_075134.j3o -254.69368 165.64214 91.69685 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/Palm_Palme1_20260522_075137.j3o -248.68674 167.64050 76.46214 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/Palm_Palme1.j3o -205.20802 165.35493 88.46772 -18.77974 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/Palm_Palme1_20260522_075102.j3o -135.84702 158.69884 84.12026 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +@plane -224.78107 164.15782 108.96712 0.00000 1.00000 0.00000 0.00000 false Models/custom_mesh_3.j3o true true 30.00000 80.00000 120.00000 +@plane -220.53658 165.75740 108.73174 0.00000 1.00000 0.00000 0.00000 false Models/custom_mesh_4.j3o true true 30.00000 80.00000 120.00000 +@plane -237.96001 165.08000 113.44000 0.00000 1.00000 0.00000 0.00000 false Models/custom_mesh_5.j3o true true 30.00000 80.00000 120.00000 +@plane -235.81349 164.75165 114.21590 0.00000 1.00000 0.00000 0.00000 false Models/custom_mesh_6.j3o true true 30.00000 80.00000 120.00000 +Models/Tree/Tree.mesh.j3o -246.86934 164.83850 107.50585 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/Boat/boat.j3o -261.74731 164.72397 120.62883 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/Campfire.j3o -350.02148 164.72334 72.42865 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/Campfire.j3o -67.93591 1.71510 -36.36593 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/tree.j3o -28.09666 16.39296 -34.64375 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/tree.j3o -83.04567 -2.69246 -39.34207 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/Tree/Tree.mesh.j3o 295.18826 1.00000 189.92809 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/gltf/duck/Duck.gltf 300.54111 1.00000 198.35368 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/Buggy/Buggy.j3o 296.60590 1.00000 201.24153 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/Jaime/Jaime.j3o 304.02374 1.00000 199.25398 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/tree.j3o 221.98000 1.00000 130.25000 0.00000 1.00000 0.00000 0.00000 true true true 30.00000 80.00000 120.00000 +Models/Palm_Palme1_20260522_075134.j3o 240.61151 1.00000 97.48973 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/Palm_Palme1_20260522_075134.j3o 150.18289 0.96490 16.69994 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/FernPlantV2.j3o 336.18240 1.00000 -164.72426 0.00000 0.00200 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/plants/fern/fern_20260608_165631.j3o 158.98721 0.96388 25.31449 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/plants/fern/fern_20260608_165628.j3o 157.71002 0.96395 20.47514 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/plants/fern/fern_20260608_165628.j3o 159.09314 0.95784 17.07811 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/plants/fern/fern_20260608_165628.j3o 160.70380 0.93929 19.18060 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/plants/fern/fern_20260608_165628.j3o 161.39258 0.90349 21.80369 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/plants/fern/fern_20260608_165628.j3o 163.20784 0.61551 16.58227 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/plants/fern/fern_20260608_165628.j3o 164.25797 0.72795 11.98990 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/plants/fern/fern_20260608_165628.j3o 164.15082 0.42406 17.46363 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/plants/fern/fern_20260608_165628.j3o 163.74956 0.53243 21.45433 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/plants/fern/fern_20260608_165628.j3o 162.27063 0.88450 24.03092 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/plants/misc/heliconia+plant+3d+model.j3o 152.94803 0.96488 8.99865 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 +Models/plants/misc/heliconia+plant+3d+model.j3o 155.57500 0.96457 10.04861 0.00000 1.00000 0.00000 0.00000 false true true 30.00000 80.00000 120.00000 diff --git a/blight-map/src/main/map/chunks/chunk_00_00.blc b/blight-map/src/main/map/chunks/chunk_00_00.blc new file mode 100644 index 0000000..b0143cb Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_01.blc b/blight-map/src/main/map/chunks/chunk_00_01.blc new file mode 100644 index 0000000..6645c39 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_02.blc b/blight-map/src/main/map/chunks/chunk_00_02.blc new file mode 100644 index 0000000..cfab93f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_03.blc b/blight-map/src/main/map/chunks/chunk_00_03.blc new file mode 100644 index 0000000..ff25f3b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_04.blc b/blight-map/src/main/map/chunks/chunk_00_04.blc new file mode 100644 index 0000000..f53775f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_05.blc b/blight-map/src/main/map/chunks/chunk_00_05.blc new file mode 100644 index 0000000..145b257 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_06.blc b/blight-map/src/main/map/chunks/chunk_00_06.blc new file mode 100644 index 0000000..1182251 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_07.blc b/blight-map/src/main/map/chunks/chunk_00_07.blc new file mode 100644 index 0000000..7dabbde Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_08.blc b/blight-map/src/main/map/chunks/chunk_00_08.blc new file mode 100644 index 0000000..a8edbf1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_09.blc b/blight-map/src/main/map/chunks/chunk_00_09.blc new file mode 100644 index 0000000..c2767b7 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_10.blc b/blight-map/src/main/map/chunks/chunk_00_10.blc new file mode 100644 index 0000000..a8f02f1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_11.blc b/blight-map/src/main/map/chunks/chunk_00_11.blc new file mode 100644 index 0000000..29adc21 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_12.blc b/blight-map/src/main/map/chunks/chunk_00_12.blc new file mode 100644 index 0000000..0790209 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_13.blc b/blight-map/src/main/map/chunks/chunk_00_13.blc new file mode 100644 index 0000000..e62d27d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_14.blc b/blight-map/src/main/map/chunks/chunk_00_14.blc new file mode 100644 index 0000000..1c5e747 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_15.blc b/blight-map/src/main/map/chunks/chunk_00_15.blc new file mode 100644 index 0000000..87df75c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_16.blc b/blight-map/src/main/map/chunks/chunk_00_16.blc new file mode 100644 index 0000000..1fa07a4 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_17.blc b/blight-map/src/main/map/chunks/chunk_00_17.blc new file mode 100644 index 0000000..1de49cb Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_18.blc b/blight-map/src/main/map/chunks/chunk_00_18.blc new file mode 100644 index 0000000..1d32e1e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_19.blc b/blight-map/src/main/map/chunks/chunk_00_19.blc new file mode 100644 index 0000000..43e58dc Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_20.blc b/blight-map/src/main/map/chunks/chunk_00_20.blc new file mode 100644 index 0000000..d695afb Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_21.blc b/blight-map/src/main/map/chunks/chunk_00_21.blc new file mode 100644 index 0000000..cef2d42 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_22.blc b/blight-map/src/main/map/chunks/chunk_00_22.blc new file mode 100644 index 0000000..e73e759 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_23.blc b/blight-map/src/main/map/chunks/chunk_00_23.blc new file mode 100644 index 0000000..ba35367 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_24.blc b/blight-map/src/main/map/chunks/chunk_00_24.blc new file mode 100644 index 0000000..0e82592 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_25.blc b/blight-map/src/main/map/chunks/chunk_00_25.blc new file mode 100644 index 0000000..f57cd8b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_26.blc b/blight-map/src/main/map/chunks/chunk_00_26.blc new file mode 100644 index 0000000..f863e9d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_27.blc b/blight-map/src/main/map/chunks/chunk_00_27.blc new file mode 100644 index 0000000..88fecc1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_28.blc b/blight-map/src/main/map/chunks/chunk_00_28.blc new file mode 100644 index 0000000..928668b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_29.blc b/blight-map/src/main/map/chunks/chunk_00_29.blc new file mode 100644 index 0000000..c26df56 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_30.blc b/blight-map/src/main/map/chunks/chunk_00_30.blc new file mode 100644 index 0000000..81af136 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_00_31.blc b/blight-map/src/main/map/chunks/chunk_00_31.blc new file mode 100644 index 0000000..9a6ad60 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_00_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_00.blc b/blight-map/src/main/map/chunks/chunk_01_00.blc new file mode 100644 index 0000000..1cf65e9 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_01.blc b/blight-map/src/main/map/chunks/chunk_01_01.blc new file mode 100644 index 0000000..5980709 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_02.blc b/blight-map/src/main/map/chunks/chunk_01_02.blc new file mode 100644 index 0000000..544e075 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_03.blc b/blight-map/src/main/map/chunks/chunk_01_03.blc new file mode 100644 index 0000000..46388e7 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_04.blc b/blight-map/src/main/map/chunks/chunk_01_04.blc new file mode 100644 index 0000000..7ce1e00 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_05.blc b/blight-map/src/main/map/chunks/chunk_01_05.blc new file mode 100644 index 0000000..34ae0c5 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_06.blc b/blight-map/src/main/map/chunks/chunk_01_06.blc new file mode 100644 index 0000000..5a331d0 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_07.blc b/blight-map/src/main/map/chunks/chunk_01_07.blc new file mode 100644 index 0000000..e8a05ce Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_08.blc b/blight-map/src/main/map/chunks/chunk_01_08.blc new file mode 100644 index 0000000..fd5f961 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_09.blc b/blight-map/src/main/map/chunks/chunk_01_09.blc new file mode 100644 index 0000000..169d973 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_10.blc b/blight-map/src/main/map/chunks/chunk_01_10.blc new file mode 100644 index 0000000..c7790d1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_11.blc b/blight-map/src/main/map/chunks/chunk_01_11.blc new file mode 100644 index 0000000..bd5fbf4 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_12.blc b/blight-map/src/main/map/chunks/chunk_01_12.blc new file mode 100644 index 0000000..a515a7b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_13.blc b/blight-map/src/main/map/chunks/chunk_01_13.blc new file mode 100644 index 0000000..eef4e9d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_14.blc b/blight-map/src/main/map/chunks/chunk_01_14.blc new file mode 100644 index 0000000..9d0f284 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_15.blc b/blight-map/src/main/map/chunks/chunk_01_15.blc new file mode 100644 index 0000000..b8ef4bf Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_16.blc b/blight-map/src/main/map/chunks/chunk_01_16.blc new file mode 100644 index 0000000..5c9b397 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_17.blc b/blight-map/src/main/map/chunks/chunk_01_17.blc new file mode 100644 index 0000000..8953ef4 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_18.blc b/blight-map/src/main/map/chunks/chunk_01_18.blc new file mode 100644 index 0000000..0d28e1b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_19.blc b/blight-map/src/main/map/chunks/chunk_01_19.blc new file mode 100644 index 0000000..adf53fc Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_20.blc b/blight-map/src/main/map/chunks/chunk_01_20.blc new file mode 100644 index 0000000..14c0d0f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_21.blc b/blight-map/src/main/map/chunks/chunk_01_21.blc new file mode 100644 index 0000000..b45e9f0 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_22.blc b/blight-map/src/main/map/chunks/chunk_01_22.blc new file mode 100644 index 0000000..983d91b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_23.blc b/blight-map/src/main/map/chunks/chunk_01_23.blc new file mode 100644 index 0000000..80d919d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_24.blc b/blight-map/src/main/map/chunks/chunk_01_24.blc new file mode 100644 index 0000000..0b42308 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_25.blc b/blight-map/src/main/map/chunks/chunk_01_25.blc new file mode 100644 index 0000000..499b38f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_26.blc b/blight-map/src/main/map/chunks/chunk_01_26.blc new file mode 100644 index 0000000..05b16cf Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_27.blc b/blight-map/src/main/map/chunks/chunk_01_27.blc new file mode 100644 index 0000000..b520095 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_28.blc b/blight-map/src/main/map/chunks/chunk_01_28.blc new file mode 100644 index 0000000..6a5f556 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_29.blc b/blight-map/src/main/map/chunks/chunk_01_29.blc new file mode 100644 index 0000000..2d5b6cd Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_30.blc b/blight-map/src/main/map/chunks/chunk_01_30.blc new file mode 100644 index 0000000..54fb0c6 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_01_31.blc b/blight-map/src/main/map/chunks/chunk_01_31.blc new file mode 100644 index 0000000..977a3da Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_01_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_00.blc b/blight-map/src/main/map/chunks/chunk_02_00.blc new file mode 100644 index 0000000..da55c0d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_01.blc b/blight-map/src/main/map/chunks/chunk_02_01.blc new file mode 100644 index 0000000..7b12695 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_02.blc b/blight-map/src/main/map/chunks/chunk_02_02.blc new file mode 100644 index 0000000..6fcedf2 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_03.blc b/blight-map/src/main/map/chunks/chunk_02_03.blc new file mode 100644 index 0000000..be9effe Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_04.blc b/blight-map/src/main/map/chunks/chunk_02_04.blc new file mode 100644 index 0000000..78ee4ad Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_05.blc b/blight-map/src/main/map/chunks/chunk_02_05.blc new file mode 100644 index 0000000..c1b31c3 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_06.blc b/blight-map/src/main/map/chunks/chunk_02_06.blc new file mode 100644 index 0000000..777b4ee Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_07.blc b/blight-map/src/main/map/chunks/chunk_02_07.blc new file mode 100644 index 0000000..5073302 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_08.blc b/blight-map/src/main/map/chunks/chunk_02_08.blc new file mode 100644 index 0000000..a228ca8 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_09.blc b/blight-map/src/main/map/chunks/chunk_02_09.blc new file mode 100644 index 0000000..ccce8c4 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_10.blc b/blight-map/src/main/map/chunks/chunk_02_10.blc new file mode 100644 index 0000000..fc29624 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_11.blc b/blight-map/src/main/map/chunks/chunk_02_11.blc new file mode 100644 index 0000000..7664f47 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_12.blc b/blight-map/src/main/map/chunks/chunk_02_12.blc new file mode 100644 index 0000000..ebd81ec Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_13.blc b/blight-map/src/main/map/chunks/chunk_02_13.blc new file mode 100644 index 0000000..328c18d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_14.blc b/blight-map/src/main/map/chunks/chunk_02_14.blc new file mode 100644 index 0000000..a2d238f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_15.blc b/blight-map/src/main/map/chunks/chunk_02_15.blc new file mode 100644 index 0000000..5670e77 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_16.blc b/blight-map/src/main/map/chunks/chunk_02_16.blc new file mode 100644 index 0000000..5a2b040 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_17.blc b/blight-map/src/main/map/chunks/chunk_02_17.blc new file mode 100644 index 0000000..701521d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_18.blc b/blight-map/src/main/map/chunks/chunk_02_18.blc new file mode 100644 index 0000000..d738867 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_19.blc b/blight-map/src/main/map/chunks/chunk_02_19.blc new file mode 100644 index 0000000..98941ca Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_20.blc b/blight-map/src/main/map/chunks/chunk_02_20.blc new file mode 100644 index 0000000..3e46585 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_21.blc b/blight-map/src/main/map/chunks/chunk_02_21.blc new file mode 100644 index 0000000..a218f79 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_22.blc b/blight-map/src/main/map/chunks/chunk_02_22.blc new file mode 100644 index 0000000..af4c73a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_23.blc b/blight-map/src/main/map/chunks/chunk_02_23.blc new file mode 100644 index 0000000..235558a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_24.blc b/blight-map/src/main/map/chunks/chunk_02_24.blc new file mode 100644 index 0000000..a6c33c5 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_25.blc b/blight-map/src/main/map/chunks/chunk_02_25.blc new file mode 100644 index 0000000..eca3852 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_26.blc b/blight-map/src/main/map/chunks/chunk_02_26.blc new file mode 100644 index 0000000..0dc8ffb Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_27.blc b/blight-map/src/main/map/chunks/chunk_02_27.blc new file mode 100644 index 0000000..dce4cb9 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_28.blc b/blight-map/src/main/map/chunks/chunk_02_28.blc new file mode 100644 index 0000000..22bc1b8 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_29.blc b/blight-map/src/main/map/chunks/chunk_02_29.blc new file mode 100644 index 0000000..a9e84f3 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_30.blc b/blight-map/src/main/map/chunks/chunk_02_30.blc new file mode 100644 index 0000000..f517d58 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_02_31.blc b/blight-map/src/main/map/chunks/chunk_02_31.blc new file mode 100644 index 0000000..be02094 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_02_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_00.blc b/blight-map/src/main/map/chunks/chunk_03_00.blc new file mode 100644 index 0000000..4837292 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_01.blc b/blight-map/src/main/map/chunks/chunk_03_01.blc new file mode 100644 index 0000000..2bf5cd6 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_02.blc b/blight-map/src/main/map/chunks/chunk_03_02.blc new file mode 100644 index 0000000..cc2d2bf Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_03.blc b/blight-map/src/main/map/chunks/chunk_03_03.blc new file mode 100644 index 0000000..3503a17 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_04.blc b/blight-map/src/main/map/chunks/chunk_03_04.blc new file mode 100644 index 0000000..7acf41a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_05.blc b/blight-map/src/main/map/chunks/chunk_03_05.blc new file mode 100644 index 0000000..e3a275e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_06.blc b/blight-map/src/main/map/chunks/chunk_03_06.blc new file mode 100644 index 0000000..1f25586 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_07.blc b/blight-map/src/main/map/chunks/chunk_03_07.blc new file mode 100644 index 0000000..b723e8d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_08.blc b/blight-map/src/main/map/chunks/chunk_03_08.blc new file mode 100644 index 0000000..1c49bdf Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_09.blc b/blight-map/src/main/map/chunks/chunk_03_09.blc new file mode 100644 index 0000000..fe4a701 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_10.blc b/blight-map/src/main/map/chunks/chunk_03_10.blc new file mode 100644 index 0000000..dfbd865 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_11.blc b/blight-map/src/main/map/chunks/chunk_03_11.blc new file mode 100644 index 0000000..68da376 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_12.blc b/blight-map/src/main/map/chunks/chunk_03_12.blc new file mode 100644 index 0000000..8de5ac6 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_13.blc b/blight-map/src/main/map/chunks/chunk_03_13.blc new file mode 100644 index 0000000..9caffaa Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_14.blc b/blight-map/src/main/map/chunks/chunk_03_14.blc new file mode 100644 index 0000000..5a900ec Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_15.blc b/blight-map/src/main/map/chunks/chunk_03_15.blc new file mode 100644 index 0000000..95b8dac Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_16.blc b/blight-map/src/main/map/chunks/chunk_03_16.blc new file mode 100644 index 0000000..e7cf760 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_17.blc b/blight-map/src/main/map/chunks/chunk_03_17.blc new file mode 100644 index 0000000..7bc000f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_18.blc b/blight-map/src/main/map/chunks/chunk_03_18.blc new file mode 100644 index 0000000..c1fe598 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_19.blc b/blight-map/src/main/map/chunks/chunk_03_19.blc new file mode 100644 index 0000000..c6a8a0b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_20.blc b/blight-map/src/main/map/chunks/chunk_03_20.blc new file mode 100644 index 0000000..893aa4d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_21.blc b/blight-map/src/main/map/chunks/chunk_03_21.blc new file mode 100644 index 0000000..3b2a890 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_22.blc b/blight-map/src/main/map/chunks/chunk_03_22.blc new file mode 100644 index 0000000..1dc6e1e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_23.blc b/blight-map/src/main/map/chunks/chunk_03_23.blc new file mode 100644 index 0000000..84bc8cd Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_24.blc b/blight-map/src/main/map/chunks/chunk_03_24.blc new file mode 100644 index 0000000..333e669 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_25.blc b/blight-map/src/main/map/chunks/chunk_03_25.blc new file mode 100644 index 0000000..26dcc6c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_26.blc b/blight-map/src/main/map/chunks/chunk_03_26.blc new file mode 100644 index 0000000..bd9c49d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_27.blc b/blight-map/src/main/map/chunks/chunk_03_27.blc new file mode 100644 index 0000000..ef4b72e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_28.blc b/blight-map/src/main/map/chunks/chunk_03_28.blc new file mode 100644 index 0000000..979d78b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_29.blc b/blight-map/src/main/map/chunks/chunk_03_29.blc new file mode 100644 index 0000000..0c8b446 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_30.blc b/blight-map/src/main/map/chunks/chunk_03_30.blc new file mode 100644 index 0000000..83fcf41 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_03_31.blc b/blight-map/src/main/map/chunks/chunk_03_31.blc new file mode 100644 index 0000000..29892f4 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_03_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_00.blc b/blight-map/src/main/map/chunks/chunk_04_00.blc new file mode 100644 index 0000000..22f6102 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_01.blc b/blight-map/src/main/map/chunks/chunk_04_01.blc new file mode 100644 index 0000000..2392227 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_02.blc b/blight-map/src/main/map/chunks/chunk_04_02.blc new file mode 100644 index 0000000..b3b9be3 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_03.blc b/blight-map/src/main/map/chunks/chunk_04_03.blc new file mode 100644 index 0000000..81af5c1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_04.blc b/blight-map/src/main/map/chunks/chunk_04_04.blc new file mode 100644 index 0000000..1423d23 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_05.blc b/blight-map/src/main/map/chunks/chunk_04_05.blc new file mode 100644 index 0000000..9cce2d3 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_06.blc b/blight-map/src/main/map/chunks/chunk_04_06.blc new file mode 100644 index 0000000..180d8cd Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_07.blc b/blight-map/src/main/map/chunks/chunk_04_07.blc new file mode 100644 index 0000000..513c9d6 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_08.blc b/blight-map/src/main/map/chunks/chunk_04_08.blc new file mode 100644 index 0000000..178ac01 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_09.blc b/blight-map/src/main/map/chunks/chunk_04_09.blc new file mode 100644 index 0000000..cdb787d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_10.blc b/blight-map/src/main/map/chunks/chunk_04_10.blc new file mode 100644 index 0000000..7360343 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_11.blc b/blight-map/src/main/map/chunks/chunk_04_11.blc new file mode 100644 index 0000000..7288b78 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_12.blc b/blight-map/src/main/map/chunks/chunk_04_12.blc new file mode 100644 index 0000000..58517f2 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_13.blc b/blight-map/src/main/map/chunks/chunk_04_13.blc new file mode 100644 index 0000000..634639a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_14.blc b/blight-map/src/main/map/chunks/chunk_04_14.blc new file mode 100644 index 0000000..229d795 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_15.blc b/blight-map/src/main/map/chunks/chunk_04_15.blc new file mode 100644 index 0000000..3281e60 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_16.blc b/blight-map/src/main/map/chunks/chunk_04_16.blc new file mode 100644 index 0000000..afde580 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_17.blc b/blight-map/src/main/map/chunks/chunk_04_17.blc new file mode 100644 index 0000000..9c7a907 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_18.blc b/blight-map/src/main/map/chunks/chunk_04_18.blc new file mode 100644 index 0000000..76435e0 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_19.blc b/blight-map/src/main/map/chunks/chunk_04_19.blc new file mode 100644 index 0000000..8466a54 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_20.blc b/blight-map/src/main/map/chunks/chunk_04_20.blc new file mode 100644 index 0000000..3a67671 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_21.blc b/blight-map/src/main/map/chunks/chunk_04_21.blc new file mode 100644 index 0000000..15045ae Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_22.blc b/blight-map/src/main/map/chunks/chunk_04_22.blc new file mode 100644 index 0000000..a5f6cff Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_23.blc b/blight-map/src/main/map/chunks/chunk_04_23.blc new file mode 100644 index 0000000..7a776d5 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_24.blc b/blight-map/src/main/map/chunks/chunk_04_24.blc new file mode 100644 index 0000000..4b88a8e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_25.blc b/blight-map/src/main/map/chunks/chunk_04_25.blc new file mode 100644 index 0000000..b4f5e0c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_26.blc b/blight-map/src/main/map/chunks/chunk_04_26.blc new file mode 100644 index 0000000..3030c86 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_27.blc b/blight-map/src/main/map/chunks/chunk_04_27.blc new file mode 100644 index 0000000..6f8107b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_28.blc b/blight-map/src/main/map/chunks/chunk_04_28.blc new file mode 100644 index 0000000..ac8f155 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_29.blc b/blight-map/src/main/map/chunks/chunk_04_29.blc new file mode 100644 index 0000000..b989cf2 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_30.blc b/blight-map/src/main/map/chunks/chunk_04_30.blc new file mode 100644 index 0000000..798f3e5 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_04_31.blc b/blight-map/src/main/map/chunks/chunk_04_31.blc new file mode 100644 index 0000000..a109259 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_04_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_00.blc b/blight-map/src/main/map/chunks/chunk_05_00.blc new file mode 100644 index 0000000..40f9873 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_01.blc b/blight-map/src/main/map/chunks/chunk_05_01.blc new file mode 100644 index 0000000..9cd9a6c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_02.blc b/blight-map/src/main/map/chunks/chunk_05_02.blc new file mode 100644 index 0000000..b527d12 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_03.blc b/blight-map/src/main/map/chunks/chunk_05_03.blc new file mode 100644 index 0000000..ac342ac Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_04.blc b/blight-map/src/main/map/chunks/chunk_05_04.blc new file mode 100644 index 0000000..3bb5ad0 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_05.blc b/blight-map/src/main/map/chunks/chunk_05_05.blc new file mode 100644 index 0000000..7b73213 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_06.blc b/blight-map/src/main/map/chunks/chunk_05_06.blc new file mode 100644 index 0000000..739d537 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_07.blc b/blight-map/src/main/map/chunks/chunk_05_07.blc new file mode 100644 index 0000000..9ffa75e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_08.blc b/blight-map/src/main/map/chunks/chunk_05_08.blc new file mode 100644 index 0000000..a442de7 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_09.blc b/blight-map/src/main/map/chunks/chunk_05_09.blc new file mode 100644 index 0000000..9b4a242 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_10.blc b/blight-map/src/main/map/chunks/chunk_05_10.blc new file mode 100644 index 0000000..742f6ca Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_11.blc b/blight-map/src/main/map/chunks/chunk_05_11.blc new file mode 100644 index 0000000..f7297ad Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_12.blc b/blight-map/src/main/map/chunks/chunk_05_12.blc new file mode 100644 index 0000000..9733a2b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_13.blc b/blight-map/src/main/map/chunks/chunk_05_13.blc new file mode 100644 index 0000000..823c5e8 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_14.blc b/blight-map/src/main/map/chunks/chunk_05_14.blc new file mode 100644 index 0000000..ac7f44f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_15.blc b/blight-map/src/main/map/chunks/chunk_05_15.blc new file mode 100644 index 0000000..1aee2f1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_16.blc b/blight-map/src/main/map/chunks/chunk_05_16.blc new file mode 100644 index 0000000..ef4f979 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_17.blc b/blight-map/src/main/map/chunks/chunk_05_17.blc new file mode 100644 index 0000000..30c3749 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_18.blc b/blight-map/src/main/map/chunks/chunk_05_18.blc new file mode 100644 index 0000000..b635b7b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_19.blc b/blight-map/src/main/map/chunks/chunk_05_19.blc new file mode 100644 index 0000000..911884d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_20.blc b/blight-map/src/main/map/chunks/chunk_05_20.blc new file mode 100644 index 0000000..09b3c77 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_21.blc b/blight-map/src/main/map/chunks/chunk_05_21.blc new file mode 100644 index 0000000..7e3be16 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_22.blc b/blight-map/src/main/map/chunks/chunk_05_22.blc new file mode 100644 index 0000000..d2a87bb Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_23.blc b/blight-map/src/main/map/chunks/chunk_05_23.blc new file mode 100644 index 0000000..3a9612d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_24.blc b/blight-map/src/main/map/chunks/chunk_05_24.blc new file mode 100644 index 0000000..c590422 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_25.blc b/blight-map/src/main/map/chunks/chunk_05_25.blc new file mode 100644 index 0000000..6c048a6 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_26.blc b/blight-map/src/main/map/chunks/chunk_05_26.blc new file mode 100644 index 0000000..b0e7eaa Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_27.blc b/blight-map/src/main/map/chunks/chunk_05_27.blc new file mode 100644 index 0000000..1301bb8 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_28.blc b/blight-map/src/main/map/chunks/chunk_05_28.blc new file mode 100644 index 0000000..6f47038 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_29.blc b/blight-map/src/main/map/chunks/chunk_05_29.blc new file mode 100644 index 0000000..3696dbb Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_30.blc b/blight-map/src/main/map/chunks/chunk_05_30.blc new file mode 100644 index 0000000..dfac2f7 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_05_31.blc b/blight-map/src/main/map/chunks/chunk_05_31.blc new file mode 100644 index 0000000..8697ae1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_05_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_00.blc b/blight-map/src/main/map/chunks/chunk_06_00.blc new file mode 100644 index 0000000..6c62c14 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_01.blc b/blight-map/src/main/map/chunks/chunk_06_01.blc new file mode 100644 index 0000000..62e8a1e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_02.blc b/blight-map/src/main/map/chunks/chunk_06_02.blc new file mode 100644 index 0000000..5d0e12e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_03.blc b/blight-map/src/main/map/chunks/chunk_06_03.blc new file mode 100644 index 0000000..2ccf962 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_04.blc b/blight-map/src/main/map/chunks/chunk_06_04.blc new file mode 100644 index 0000000..64f83e7 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_05.blc b/blight-map/src/main/map/chunks/chunk_06_05.blc new file mode 100644 index 0000000..35cc1d6 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_06.blc b/blight-map/src/main/map/chunks/chunk_06_06.blc new file mode 100644 index 0000000..67936af Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_07.blc b/blight-map/src/main/map/chunks/chunk_06_07.blc new file mode 100644 index 0000000..7b0494f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_08.blc b/blight-map/src/main/map/chunks/chunk_06_08.blc new file mode 100644 index 0000000..b1c2d85 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_09.blc b/blight-map/src/main/map/chunks/chunk_06_09.blc new file mode 100644 index 0000000..ac20731 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_10.blc b/blight-map/src/main/map/chunks/chunk_06_10.blc new file mode 100644 index 0000000..33e7077 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_11.blc b/blight-map/src/main/map/chunks/chunk_06_11.blc new file mode 100644 index 0000000..955583a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_12.blc b/blight-map/src/main/map/chunks/chunk_06_12.blc new file mode 100644 index 0000000..9b6f93e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_13.blc b/blight-map/src/main/map/chunks/chunk_06_13.blc new file mode 100644 index 0000000..8ce8d9a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_14.blc b/blight-map/src/main/map/chunks/chunk_06_14.blc new file mode 100644 index 0000000..9b593a7 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_15.blc b/blight-map/src/main/map/chunks/chunk_06_15.blc new file mode 100644 index 0000000..3ab11b0 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_16.blc b/blight-map/src/main/map/chunks/chunk_06_16.blc new file mode 100644 index 0000000..2759d2e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_17.blc b/blight-map/src/main/map/chunks/chunk_06_17.blc new file mode 100644 index 0000000..c0ee355 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_18.blc b/blight-map/src/main/map/chunks/chunk_06_18.blc new file mode 100644 index 0000000..7d61cd8 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_19.blc b/blight-map/src/main/map/chunks/chunk_06_19.blc new file mode 100644 index 0000000..74dc89d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_20.blc b/blight-map/src/main/map/chunks/chunk_06_20.blc new file mode 100644 index 0000000..fd40bcc Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_21.blc b/blight-map/src/main/map/chunks/chunk_06_21.blc new file mode 100644 index 0000000..ff99eac Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_22.blc b/blight-map/src/main/map/chunks/chunk_06_22.blc new file mode 100644 index 0000000..5dcbe46 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_23.blc b/blight-map/src/main/map/chunks/chunk_06_23.blc new file mode 100644 index 0000000..4cdd476 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_24.blc b/blight-map/src/main/map/chunks/chunk_06_24.blc new file mode 100644 index 0000000..f8f6e78 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_25.blc b/blight-map/src/main/map/chunks/chunk_06_25.blc new file mode 100644 index 0000000..1798aa9 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_26.blc b/blight-map/src/main/map/chunks/chunk_06_26.blc new file mode 100644 index 0000000..f95c11f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_27.blc b/blight-map/src/main/map/chunks/chunk_06_27.blc new file mode 100644 index 0000000..88341f3 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_28.blc b/blight-map/src/main/map/chunks/chunk_06_28.blc new file mode 100644 index 0000000..d0d6955 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_29.blc b/blight-map/src/main/map/chunks/chunk_06_29.blc new file mode 100644 index 0000000..b505422 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_30.blc b/blight-map/src/main/map/chunks/chunk_06_30.blc new file mode 100644 index 0000000..3d5ce6d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_06_31.blc b/blight-map/src/main/map/chunks/chunk_06_31.blc new file mode 100644 index 0000000..c53ba50 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_06_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_00.blc b/blight-map/src/main/map/chunks/chunk_07_00.blc new file mode 100644 index 0000000..260c0e4 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_01.blc b/blight-map/src/main/map/chunks/chunk_07_01.blc new file mode 100644 index 0000000..598b5cc Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_02.blc b/blight-map/src/main/map/chunks/chunk_07_02.blc new file mode 100644 index 0000000..84f832a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_03.blc b/blight-map/src/main/map/chunks/chunk_07_03.blc new file mode 100644 index 0000000..6c79077 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_04.blc b/blight-map/src/main/map/chunks/chunk_07_04.blc new file mode 100644 index 0000000..05e665f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_05.blc b/blight-map/src/main/map/chunks/chunk_07_05.blc new file mode 100644 index 0000000..05f74aa Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_06.blc b/blight-map/src/main/map/chunks/chunk_07_06.blc new file mode 100644 index 0000000..5124644 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_07.blc b/blight-map/src/main/map/chunks/chunk_07_07.blc new file mode 100644 index 0000000..b17d4ee Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_08.blc b/blight-map/src/main/map/chunks/chunk_07_08.blc new file mode 100644 index 0000000..68e8fdd Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_09.blc b/blight-map/src/main/map/chunks/chunk_07_09.blc new file mode 100644 index 0000000..9228945 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_10.blc b/blight-map/src/main/map/chunks/chunk_07_10.blc new file mode 100644 index 0000000..5a897d1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_11.blc b/blight-map/src/main/map/chunks/chunk_07_11.blc new file mode 100644 index 0000000..8a3516a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_12.blc b/blight-map/src/main/map/chunks/chunk_07_12.blc new file mode 100644 index 0000000..592fc36 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_13.blc b/blight-map/src/main/map/chunks/chunk_07_13.blc new file mode 100644 index 0000000..fc597b3 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_14.blc b/blight-map/src/main/map/chunks/chunk_07_14.blc new file mode 100644 index 0000000..b19f1d1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_15.blc b/blight-map/src/main/map/chunks/chunk_07_15.blc new file mode 100644 index 0000000..1f2b474 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_16.blc b/blight-map/src/main/map/chunks/chunk_07_16.blc new file mode 100644 index 0000000..f15d024 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_17.blc b/blight-map/src/main/map/chunks/chunk_07_17.blc new file mode 100644 index 0000000..041eb38 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_18.blc b/blight-map/src/main/map/chunks/chunk_07_18.blc new file mode 100644 index 0000000..3833384 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_19.blc b/blight-map/src/main/map/chunks/chunk_07_19.blc new file mode 100644 index 0000000..8f428ae Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_20.blc b/blight-map/src/main/map/chunks/chunk_07_20.blc new file mode 100644 index 0000000..b6f293b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_21.blc b/blight-map/src/main/map/chunks/chunk_07_21.blc new file mode 100644 index 0000000..b3fd6b6 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_22.blc b/blight-map/src/main/map/chunks/chunk_07_22.blc new file mode 100644 index 0000000..f9817ab Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_23.blc b/blight-map/src/main/map/chunks/chunk_07_23.blc new file mode 100644 index 0000000..7cd3aa0 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_24.blc b/blight-map/src/main/map/chunks/chunk_07_24.blc new file mode 100644 index 0000000..580a61e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_25.blc b/blight-map/src/main/map/chunks/chunk_07_25.blc new file mode 100644 index 0000000..6a22bec Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_26.blc b/blight-map/src/main/map/chunks/chunk_07_26.blc new file mode 100644 index 0000000..9d53862 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_27.blc b/blight-map/src/main/map/chunks/chunk_07_27.blc new file mode 100644 index 0000000..91df331 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_28.blc b/blight-map/src/main/map/chunks/chunk_07_28.blc new file mode 100644 index 0000000..fd81a6a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_29.blc b/blight-map/src/main/map/chunks/chunk_07_29.blc new file mode 100644 index 0000000..64ec337 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_30.blc b/blight-map/src/main/map/chunks/chunk_07_30.blc new file mode 100644 index 0000000..4de0884 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_07_31.blc b/blight-map/src/main/map/chunks/chunk_07_31.blc new file mode 100644 index 0000000..0c34738 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_07_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_00.blc b/blight-map/src/main/map/chunks/chunk_08_00.blc new file mode 100644 index 0000000..7faa8a1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_01.blc b/blight-map/src/main/map/chunks/chunk_08_01.blc new file mode 100644 index 0000000..17ed433 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_02.blc b/blight-map/src/main/map/chunks/chunk_08_02.blc new file mode 100644 index 0000000..1b95b65 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_03.blc b/blight-map/src/main/map/chunks/chunk_08_03.blc new file mode 100644 index 0000000..f531153 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_04.blc b/blight-map/src/main/map/chunks/chunk_08_04.blc new file mode 100644 index 0000000..7733db3 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_05.blc b/blight-map/src/main/map/chunks/chunk_08_05.blc new file mode 100644 index 0000000..59849b8 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_06.blc b/blight-map/src/main/map/chunks/chunk_08_06.blc new file mode 100644 index 0000000..c0fe6cf Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_07.blc b/blight-map/src/main/map/chunks/chunk_08_07.blc new file mode 100644 index 0000000..00e1108 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_08.blc b/blight-map/src/main/map/chunks/chunk_08_08.blc new file mode 100644 index 0000000..4906a08 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_09.blc b/blight-map/src/main/map/chunks/chunk_08_09.blc new file mode 100644 index 0000000..0afe97e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_10.blc b/blight-map/src/main/map/chunks/chunk_08_10.blc new file mode 100644 index 0000000..460b0de Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_11.blc b/blight-map/src/main/map/chunks/chunk_08_11.blc new file mode 100644 index 0000000..00bcbc1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_12.blc b/blight-map/src/main/map/chunks/chunk_08_12.blc new file mode 100644 index 0000000..bc0edcc Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_13.blc b/blight-map/src/main/map/chunks/chunk_08_13.blc new file mode 100644 index 0000000..7e81a1d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_14.blc b/blight-map/src/main/map/chunks/chunk_08_14.blc new file mode 100644 index 0000000..9ef0270 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_15.blc b/blight-map/src/main/map/chunks/chunk_08_15.blc new file mode 100644 index 0000000..213676b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_16.blc b/blight-map/src/main/map/chunks/chunk_08_16.blc new file mode 100644 index 0000000..a9b12c6 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_17.blc b/blight-map/src/main/map/chunks/chunk_08_17.blc new file mode 100644 index 0000000..9a34c08 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_18.blc b/blight-map/src/main/map/chunks/chunk_08_18.blc new file mode 100644 index 0000000..d1ebb8d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_19.blc b/blight-map/src/main/map/chunks/chunk_08_19.blc new file mode 100644 index 0000000..3f59114 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_20.blc b/blight-map/src/main/map/chunks/chunk_08_20.blc new file mode 100644 index 0000000..9ac3e21 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_21.blc b/blight-map/src/main/map/chunks/chunk_08_21.blc new file mode 100644 index 0000000..f1051a6 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_22.blc b/blight-map/src/main/map/chunks/chunk_08_22.blc new file mode 100644 index 0000000..864b0f4 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_23.blc b/blight-map/src/main/map/chunks/chunk_08_23.blc new file mode 100644 index 0000000..971e8e5 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_24.blc b/blight-map/src/main/map/chunks/chunk_08_24.blc new file mode 100644 index 0000000..3576846 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_25.blc b/blight-map/src/main/map/chunks/chunk_08_25.blc new file mode 100644 index 0000000..787ec85 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_26.blc b/blight-map/src/main/map/chunks/chunk_08_26.blc new file mode 100644 index 0000000..4b5a7c4 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_27.blc b/blight-map/src/main/map/chunks/chunk_08_27.blc new file mode 100644 index 0000000..cfd5b2a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_28.blc b/blight-map/src/main/map/chunks/chunk_08_28.blc new file mode 100644 index 0000000..b95833d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_29.blc b/blight-map/src/main/map/chunks/chunk_08_29.blc new file mode 100644 index 0000000..6551186 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_30.blc b/blight-map/src/main/map/chunks/chunk_08_30.blc new file mode 100644 index 0000000..f098fae Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_08_31.blc b/blight-map/src/main/map/chunks/chunk_08_31.blc new file mode 100644 index 0000000..ef860c8 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_08_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_00.blc b/blight-map/src/main/map/chunks/chunk_09_00.blc new file mode 100644 index 0000000..cd3e1b3 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_01.blc b/blight-map/src/main/map/chunks/chunk_09_01.blc new file mode 100644 index 0000000..cb5ca14 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_02.blc b/blight-map/src/main/map/chunks/chunk_09_02.blc new file mode 100644 index 0000000..4ac42c5 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_03.blc b/blight-map/src/main/map/chunks/chunk_09_03.blc new file mode 100644 index 0000000..68442cf Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_04.blc b/blight-map/src/main/map/chunks/chunk_09_04.blc new file mode 100644 index 0000000..5831769 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_05.blc b/blight-map/src/main/map/chunks/chunk_09_05.blc new file mode 100644 index 0000000..cc77143 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_06.blc b/blight-map/src/main/map/chunks/chunk_09_06.blc new file mode 100644 index 0000000..c7309a1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_07.blc b/blight-map/src/main/map/chunks/chunk_09_07.blc new file mode 100644 index 0000000..74abdd1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_08.blc b/blight-map/src/main/map/chunks/chunk_09_08.blc new file mode 100644 index 0000000..bcd7b08 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_09.blc b/blight-map/src/main/map/chunks/chunk_09_09.blc new file mode 100644 index 0000000..24e5a55 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_10.blc b/blight-map/src/main/map/chunks/chunk_09_10.blc new file mode 100644 index 0000000..184abf4 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_11.blc b/blight-map/src/main/map/chunks/chunk_09_11.blc new file mode 100644 index 0000000..57eb6e9 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_12.blc b/blight-map/src/main/map/chunks/chunk_09_12.blc new file mode 100644 index 0000000..48752de Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_13.blc b/blight-map/src/main/map/chunks/chunk_09_13.blc new file mode 100644 index 0000000..d597531 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_14.blc b/blight-map/src/main/map/chunks/chunk_09_14.blc new file mode 100644 index 0000000..b5f026a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_15.blc b/blight-map/src/main/map/chunks/chunk_09_15.blc new file mode 100644 index 0000000..7ebb60b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_16.blc b/blight-map/src/main/map/chunks/chunk_09_16.blc new file mode 100644 index 0000000..288077e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_17.blc b/blight-map/src/main/map/chunks/chunk_09_17.blc new file mode 100644 index 0000000..901a285 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_18.blc b/blight-map/src/main/map/chunks/chunk_09_18.blc new file mode 100644 index 0000000..d712801 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_19.blc b/blight-map/src/main/map/chunks/chunk_09_19.blc new file mode 100644 index 0000000..1ca7b28 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_20.blc b/blight-map/src/main/map/chunks/chunk_09_20.blc new file mode 100644 index 0000000..7d70c14 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_21.blc b/blight-map/src/main/map/chunks/chunk_09_21.blc new file mode 100644 index 0000000..1958e88 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_22.blc b/blight-map/src/main/map/chunks/chunk_09_22.blc new file mode 100644 index 0000000..6092b8e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_23.blc b/blight-map/src/main/map/chunks/chunk_09_23.blc new file mode 100644 index 0000000..c325549 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_24.blc b/blight-map/src/main/map/chunks/chunk_09_24.blc new file mode 100644 index 0000000..a4f155f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_25.blc b/blight-map/src/main/map/chunks/chunk_09_25.blc new file mode 100644 index 0000000..d86af0d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_26.blc b/blight-map/src/main/map/chunks/chunk_09_26.blc new file mode 100644 index 0000000..4ccc64f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_27.blc b/blight-map/src/main/map/chunks/chunk_09_27.blc new file mode 100644 index 0000000..1df1fd0 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_28.blc b/blight-map/src/main/map/chunks/chunk_09_28.blc new file mode 100644 index 0000000..62d6fa9 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_29.blc b/blight-map/src/main/map/chunks/chunk_09_29.blc new file mode 100644 index 0000000..dbdba70 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_30.blc b/blight-map/src/main/map/chunks/chunk_09_30.blc new file mode 100644 index 0000000..f6a86d6 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_09_31.blc b/blight-map/src/main/map/chunks/chunk_09_31.blc new file mode 100644 index 0000000..0af1d95 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_09_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_00.blc b/blight-map/src/main/map/chunks/chunk_10_00.blc new file mode 100644 index 0000000..6e54699 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_01.blc b/blight-map/src/main/map/chunks/chunk_10_01.blc new file mode 100644 index 0000000..1ccb39a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_02.blc b/blight-map/src/main/map/chunks/chunk_10_02.blc new file mode 100644 index 0000000..f0e7d96 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_03.blc b/blight-map/src/main/map/chunks/chunk_10_03.blc new file mode 100644 index 0000000..deed67d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_04.blc b/blight-map/src/main/map/chunks/chunk_10_04.blc new file mode 100644 index 0000000..8f358fe Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_05.blc b/blight-map/src/main/map/chunks/chunk_10_05.blc new file mode 100644 index 0000000..2167841 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_06.blc b/blight-map/src/main/map/chunks/chunk_10_06.blc new file mode 100644 index 0000000..f0caacf Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_07.blc b/blight-map/src/main/map/chunks/chunk_10_07.blc new file mode 100644 index 0000000..e6a43ac Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_08.blc b/blight-map/src/main/map/chunks/chunk_10_08.blc new file mode 100644 index 0000000..800ea5e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_09.blc b/blight-map/src/main/map/chunks/chunk_10_09.blc new file mode 100644 index 0000000..7632c6e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_10.blc b/blight-map/src/main/map/chunks/chunk_10_10.blc new file mode 100644 index 0000000..0425499 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_11.blc b/blight-map/src/main/map/chunks/chunk_10_11.blc new file mode 100644 index 0000000..e260670 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_12.blc b/blight-map/src/main/map/chunks/chunk_10_12.blc new file mode 100644 index 0000000..8294ee8 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_13.blc b/blight-map/src/main/map/chunks/chunk_10_13.blc new file mode 100644 index 0000000..f24b388 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_14.blc b/blight-map/src/main/map/chunks/chunk_10_14.blc new file mode 100644 index 0000000..919d1c9 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_15.blc b/blight-map/src/main/map/chunks/chunk_10_15.blc new file mode 100644 index 0000000..9463c8d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_16.blc b/blight-map/src/main/map/chunks/chunk_10_16.blc new file mode 100644 index 0000000..e3f290c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_17.blc b/blight-map/src/main/map/chunks/chunk_10_17.blc new file mode 100644 index 0000000..8c729e9 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_18.blc b/blight-map/src/main/map/chunks/chunk_10_18.blc new file mode 100644 index 0000000..9cd77b6 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_19.blc b/blight-map/src/main/map/chunks/chunk_10_19.blc new file mode 100644 index 0000000..bbf6273 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_20.blc b/blight-map/src/main/map/chunks/chunk_10_20.blc new file mode 100644 index 0000000..8997751 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_21.blc b/blight-map/src/main/map/chunks/chunk_10_21.blc new file mode 100644 index 0000000..29330c5 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_22.blc b/blight-map/src/main/map/chunks/chunk_10_22.blc new file mode 100644 index 0000000..19c21b3 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_23.blc b/blight-map/src/main/map/chunks/chunk_10_23.blc new file mode 100644 index 0000000..3e044a0 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_24.blc b/blight-map/src/main/map/chunks/chunk_10_24.blc new file mode 100644 index 0000000..a3566f4 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_25.blc b/blight-map/src/main/map/chunks/chunk_10_25.blc new file mode 100644 index 0000000..6c4cd64 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_26.blc b/blight-map/src/main/map/chunks/chunk_10_26.blc new file mode 100644 index 0000000..ce971c8 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_27.blc b/blight-map/src/main/map/chunks/chunk_10_27.blc new file mode 100644 index 0000000..dc2ad44 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_28.blc b/blight-map/src/main/map/chunks/chunk_10_28.blc new file mode 100644 index 0000000..bae4d0c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_29.blc b/blight-map/src/main/map/chunks/chunk_10_29.blc new file mode 100644 index 0000000..b446b3d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_30.blc b/blight-map/src/main/map/chunks/chunk_10_30.blc new file mode 100644 index 0000000..b460ec1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_10_31.blc b/blight-map/src/main/map/chunks/chunk_10_31.blc new file mode 100644 index 0000000..0c10fa6 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_10_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_00.blc b/blight-map/src/main/map/chunks/chunk_11_00.blc new file mode 100644 index 0000000..5755936 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_01.blc b/blight-map/src/main/map/chunks/chunk_11_01.blc new file mode 100644 index 0000000..4966600 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_02.blc b/blight-map/src/main/map/chunks/chunk_11_02.blc new file mode 100644 index 0000000..5f3020e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_03.blc b/blight-map/src/main/map/chunks/chunk_11_03.blc new file mode 100644 index 0000000..601ef90 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_04.blc b/blight-map/src/main/map/chunks/chunk_11_04.blc new file mode 100644 index 0000000..3929fe3 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_05.blc b/blight-map/src/main/map/chunks/chunk_11_05.blc new file mode 100644 index 0000000..0e51b20 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_06.blc b/blight-map/src/main/map/chunks/chunk_11_06.blc new file mode 100644 index 0000000..75a6787 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_07.blc b/blight-map/src/main/map/chunks/chunk_11_07.blc new file mode 100644 index 0000000..2b1a5be Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_08.blc b/blight-map/src/main/map/chunks/chunk_11_08.blc new file mode 100644 index 0000000..43acab4 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_09.blc b/blight-map/src/main/map/chunks/chunk_11_09.blc new file mode 100644 index 0000000..1e82b4c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_10.blc b/blight-map/src/main/map/chunks/chunk_11_10.blc new file mode 100644 index 0000000..bdf5aa7 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_11.blc b/blight-map/src/main/map/chunks/chunk_11_11.blc new file mode 100644 index 0000000..ec60029 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_12.blc b/blight-map/src/main/map/chunks/chunk_11_12.blc new file mode 100644 index 0000000..45687b4 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_13.blc b/blight-map/src/main/map/chunks/chunk_11_13.blc new file mode 100644 index 0000000..6241a69 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_14.blc b/blight-map/src/main/map/chunks/chunk_11_14.blc new file mode 100644 index 0000000..22e333c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_15.blc b/blight-map/src/main/map/chunks/chunk_11_15.blc new file mode 100644 index 0000000..7eab91b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_16.blc b/blight-map/src/main/map/chunks/chunk_11_16.blc new file mode 100644 index 0000000..a33989c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_17.blc b/blight-map/src/main/map/chunks/chunk_11_17.blc new file mode 100644 index 0000000..c540fa7 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_18.blc b/blight-map/src/main/map/chunks/chunk_11_18.blc new file mode 100644 index 0000000..3776da9 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_19.blc b/blight-map/src/main/map/chunks/chunk_11_19.blc new file mode 100644 index 0000000..8c703bc Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_20.blc b/blight-map/src/main/map/chunks/chunk_11_20.blc new file mode 100644 index 0000000..128826a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_21.blc b/blight-map/src/main/map/chunks/chunk_11_21.blc new file mode 100644 index 0000000..602ea61 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_22.blc b/blight-map/src/main/map/chunks/chunk_11_22.blc new file mode 100644 index 0000000..7313efd Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_23.blc b/blight-map/src/main/map/chunks/chunk_11_23.blc new file mode 100644 index 0000000..400a3ab Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_24.blc b/blight-map/src/main/map/chunks/chunk_11_24.blc new file mode 100644 index 0000000..1be7e26 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_25.blc b/blight-map/src/main/map/chunks/chunk_11_25.blc new file mode 100644 index 0000000..e5f2221 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_26.blc b/blight-map/src/main/map/chunks/chunk_11_26.blc new file mode 100644 index 0000000..b22cd25 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_27.blc b/blight-map/src/main/map/chunks/chunk_11_27.blc new file mode 100644 index 0000000..2367f61 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_28.blc b/blight-map/src/main/map/chunks/chunk_11_28.blc new file mode 100644 index 0000000..f141019 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_29.blc b/blight-map/src/main/map/chunks/chunk_11_29.blc new file mode 100644 index 0000000..424e237 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_30.blc b/blight-map/src/main/map/chunks/chunk_11_30.blc new file mode 100644 index 0000000..705087e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_11_31.blc b/blight-map/src/main/map/chunks/chunk_11_31.blc new file mode 100644 index 0000000..807ab37 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_11_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_00.blc b/blight-map/src/main/map/chunks/chunk_12_00.blc new file mode 100644 index 0000000..cf12349 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_01.blc b/blight-map/src/main/map/chunks/chunk_12_01.blc new file mode 100644 index 0000000..c32298b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_02.blc b/blight-map/src/main/map/chunks/chunk_12_02.blc new file mode 100644 index 0000000..6e36c5a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_03.blc b/blight-map/src/main/map/chunks/chunk_12_03.blc new file mode 100644 index 0000000..131b32a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_04.blc b/blight-map/src/main/map/chunks/chunk_12_04.blc new file mode 100644 index 0000000..8906d2e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_05.blc b/blight-map/src/main/map/chunks/chunk_12_05.blc new file mode 100644 index 0000000..a6342b1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_06.blc b/blight-map/src/main/map/chunks/chunk_12_06.blc new file mode 100644 index 0000000..c06a5bb Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_07.blc b/blight-map/src/main/map/chunks/chunk_12_07.blc new file mode 100644 index 0000000..d40afef Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_08.blc b/blight-map/src/main/map/chunks/chunk_12_08.blc new file mode 100644 index 0000000..a44c57a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_09.blc b/blight-map/src/main/map/chunks/chunk_12_09.blc new file mode 100644 index 0000000..f4d27f3 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_10.blc b/blight-map/src/main/map/chunks/chunk_12_10.blc new file mode 100644 index 0000000..a441221 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_11.blc b/blight-map/src/main/map/chunks/chunk_12_11.blc new file mode 100644 index 0000000..522b9ff Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_12.blc b/blight-map/src/main/map/chunks/chunk_12_12.blc new file mode 100644 index 0000000..16b2009 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_13.blc b/blight-map/src/main/map/chunks/chunk_12_13.blc new file mode 100644 index 0000000..6de02c0 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_14.blc b/blight-map/src/main/map/chunks/chunk_12_14.blc new file mode 100644 index 0000000..3df599c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_15.blc b/blight-map/src/main/map/chunks/chunk_12_15.blc new file mode 100644 index 0000000..95753c1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_16.blc b/blight-map/src/main/map/chunks/chunk_12_16.blc new file mode 100644 index 0000000..bdb11c4 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_17.blc b/blight-map/src/main/map/chunks/chunk_12_17.blc new file mode 100644 index 0000000..1f47bd3 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_18.blc b/blight-map/src/main/map/chunks/chunk_12_18.blc new file mode 100644 index 0000000..71d1395 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_19.blc b/blight-map/src/main/map/chunks/chunk_12_19.blc new file mode 100644 index 0000000..8e0bd4d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_20.blc b/blight-map/src/main/map/chunks/chunk_12_20.blc new file mode 100644 index 0000000..1cb5a26 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_21.blc b/blight-map/src/main/map/chunks/chunk_12_21.blc new file mode 100644 index 0000000..95c0a6b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_22.blc b/blight-map/src/main/map/chunks/chunk_12_22.blc new file mode 100644 index 0000000..db37ebe Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_23.blc b/blight-map/src/main/map/chunks/chunk_12_23.blc new file mode 100644 index 0000000..687ea84 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_24.blc b/blight-map/src/main/map/chunks/chunk_12_24.blc new file mode 100644 index 0000000..fa860d3 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_25.blc b/blight-map/src/main/map/chunks/chunk_12_25.blc new file mode 100644 index 0000000..f66cebc Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_26.blc b/blight-map/src/main/map/chunks/chunk_12_26.blc new file mode 100644 index 0000000..0943948 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_27.blc b/blight-map/src/main/map/chunks/chunk_12_27.blc new file mode 100644 index 0000000..18d868f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_28.blc b/blight-map/src/main/map/chunks/chunk_12_28.blc new file mode 100644 index 0000000..f782834 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_29.blc b/blight-map/src/main/map/chunks/chunk_12_29.blc new file mode 100644 index 0000000..88e7efb Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_30.blc b/blight-map/src/main/map/chunks/chunk_12_30.blc new file mode 100644 index 0000000..15442ef Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_12_31.blc b/blight-map/src/main/map/chunks/chunk_12_31.blc new file mode 100644 index 0000000..9b82771 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_12_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_00.blc b/blight-map/src/main/map/chunks/chunk_13_00.blc new file mode 100644 index 0000000..97440e7 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_01.blc b/blight-map/src/main/map/chunks/chunk_13_01.blc new file mode 100644 index 0000000..dd84063 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_02.blc b/blight-map/src/main/map/chunks/chunk_13_02.blc new file mode 100644 index 0000000..b25c7ca Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_03.blc b/blight-map/src/main/map/chunks/chunk_13_03.blc new file mode 100644 index 0000000..1398566 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_04.blc b/blight-map/src/main/map/chunks/chunk_13_04.blc new file mode 100644 index 0000000..103f2e9 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_05.blc b/blight-map/src/main/map/chunks/chunk_13_05.blc new file mode 100644 index 0000000..1632dbf Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_06.blc b/blight-map/src/main/map/chunks/chunk_13_06.blc new file mode 100644 index 0000000..9c7457a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_07.blc b/blight-map/src/main/map/chunks/chunk_13_07.blc new file mode 100644 index 0000000..255746b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_08.blc b/blight-map/src/main/map/chunks/chunk_13_08.blc new file mode 100644 index 0000000..73c5f1c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_09.blc b/blight-map/src/main/map/chunks/chunk_13_09.blc new file mode 100644 index 0000000..9dd7511 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_10.blc b/blight-map/src/main/map/chunks/chunk_13_10.blc new file mode 100644 index 0000000..10c701c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_11.blc b/blight-map/src/main/map/chunks/chunk_13_11.blc new file mode 100644 index 0000000..61e9050 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_12.blc b/blight-map/src/main/map/chunks/chunk_13_12.blc new file mode 100644 index 0000000..982886f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_13.blc b/blight-map/src/main/map/chunks/chunk_13_13.blc new file mode 100644 index 0000000..43a7fb4 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_14.blc b/blight-map/src/main/map/chunks/chunk_13_14.blc new file mode 100644 index 0000000..2153a0c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_15.blc b/blight-map/src/main/map/chunks/chunk_13_15.blc new file mode 100644 index 0000000..06f7c9b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_16.blc b/blight-map/src/main/map/chunks/chunk_13_16.blc new file mode 100644 index 0000000..150ea33 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_17.blc b/blight-map/src/main/map/chunks/chunk_13_17.blc new file mode 100644 index 0000000..e38886f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_18.blc b/blight-map/src/main/map/chunks/chunk_13_18.blc new file mode 100644 index 0000000..6a17b17 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_19.blc b/blight-map/src/main/map/chunks/chunk_13_19.blc new file mode 100644 index 0000000..3e21ca3 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_20.blc b/blight-map/src/main/map/chunks/chunk_13_20.blc new file mode 100644 index 0000000..d9b08de Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_21.blc b/blight-map/src/main/map/chunks/chunk_13_21.blc new file mode 100644 index 0000000..0c2e851 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_22.blc b/blight-map/src/main/map/chunks/chunk_13_22.blc new file mode 100644 index 0000000..c5ef09c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_23.blc b/blight-map/src/main/map/chunks/chunk_13_23.blc new file mode 100644 index 0000000..02a8da3 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_24.blc b/blight-map/src/main/map/chunks/chunk_13_24.blc new file mode 100644 index 0000000..3f6ed0a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_25.blc b/blight-map/src/main/map/chunks/chunk_13_25.blc new file mode 100644 index 0000000..33e2480 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_26.blc b/blight-map/src/main/map/chunks/chunk_13_26.blc new file mode 100644 index 0000000..e054558 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_27.blc b/blight-map/src/main/map/chunks/chunk_13_27.blc new file mode 100644 index 0000000..38d64fc Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_28.blc b/blight-map/src/main/map/chunks/chunk_13_28.blc new file mode 100644 index 0000000..b6ec5fe Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_29.blc b/blight-map/src/main/map/chunks/chunk_13_29.blc new file mode 100644 index 0000000..29507a2 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_30.blc b/blight-map/src/main/map/chunks/chunk_13_30.blc new file mode 100644 index 0000000..a18c81c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_13_31.blc b/blight-map/src/main/map/chunks/chunk_13_31.blc new file mode 100644 index 0000000..5878026 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_13_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_00.blc b/blight-map/src/main/map/chunks/chunk_14_00.blc new file mode 100644 index 0000000..3e28466 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_01.blc b/blight-map/src/main/map/chunks/chunk_14_01.blc new file mode 100644 index 0000000..5d25c7c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_02.blc b/blight-map/src/main/map/chunks/chunk_14_02.blc new file mode 100644 index 0000000..cfad5cb Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_03.blc b/blight-map/src/main/map/chunks/chunk_14_03.blc new file mode 100644 index 0000000..abc72db Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_04.blc b/blight-map/src/main/map/chunks/chunk_14_04.blc new file mode 100644 index 0000000..136e467 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_05.blc b/blight-map/src/main/map/chunks/chunk_14_05.blc new file mode 100644 index 0000000..485affe Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_06.blc b/blight-map/src/main/map/chunks/chunk_14_06.blc new file mode 100644 index 0000000..9ea6905 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_07.blc b/blight-map/src/main/map/chunks/chunk_14_07.blc new file mode 100644 index 0000000..5a96cb2 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_08.blc b/blight-map/src/main/map/chunks/chunk_14_08.blc new file mode 100644 index 0000000..70efc43 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_09.blc b/blight-map/src/main/map/chunks/chunk_14_09.blc new file mode 100644 index 0000000..599d104 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_10.blc b/blight-map/src/main/map/chunks/chunk_14_10.blc new file mode 100644 index 0000000..e3c0af8 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_11.blc b/blight-map/src/main/map/chunks/chunk_14_11.blc new file mode 100644 index 0000000..4617bee Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_12.blc b/blight-map/src/main/map/chunks/chunk_14_12.blc new file mode 100644 index 0000000..62f29df Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_13.blc b/blight-map/src/main/map/chunks/chunk_14_13.blc new file mode 100644 index 0000000..e231836 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_14.blc b/blight-map/src/main/map/chunks/chunk_14_14.blc new file mode 100644 index 0000000..f323554 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_15.blc b/blight-map/src/main/map/chunks/chunk_14_15.blc new file mode 100644 index 0000000..2c47db1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_16.blc b/blight-map/src/main/map/chunks/chunk_14_16.blc new file mode 100644 index 0000000..db2583d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_17.blc b/blight-map/src/main/map/chunks/chunk_14_17.blc new file mode 100644 index 0000000..b750db1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_18.blc b/blight-map/src/main/map/chunks/chunk_14_18.blc new file mode 100644 index 0000000..c9c6e01 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_19.blc b/blight-map/src/main/map/chunks/chunk_14_19.blc new file mode 100644 index 0000000..c289b03 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_20.blc b/blight-map/src/main/map/chunks/chunk_14_20.blc new file mode 100644 index 0000000..aa06e91 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_21.blc b/blight-map/src/main/map/chunks/chunk_14_21.blc new file mode 100644 index 0000000..ee1fdf8 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_22.blc b/blight-map/src/main/map/chunks/chunk_14_22.blc new file mode 100644 index 0000000..2c844ff Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_23.blc b/blight-map/src/main/map/chunks/chunk_14_23.blc new file mode 100644 index 0000000..8950b0d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_24.blc b/blight-map/src/main/map/chunks/chunk_14_24.blc new file mode 100644 index 0000000..7241603 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_25.blc b/blight-map/src/main/map/chunks/chunk_14_25.blc new file mode 100644 index 0000000..2709fe7 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_26.blc b/blight-map/src/main/map/chunks/chunk_14_26.blc new file mode 100644 index 0000000..5bd3974 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_27.blc b/blight-map/src/main/map/chunks/chunk_14_27.blc new file mode 100644 index 0000000..01678b0 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_28.blc b/blight-map/src/main/map/chunks/chunk_14_28.blc new file mode 100644 index 0000000..4e3c404 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_29.blc b/blight-map/src/main/map/chunks/chunk_14_29.blc new file mode 100644 index 0000000..db60a52 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_30.blc b/blight-map/src/main/map/chunks/chunk_14_30.blc new file mode 100644 index 0000000..1c6a909 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_14_31.blc b/blight-map/src/main/map/chunks/chunk_14_31.blc new file mode 100644 index 0000000..60def58 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_14_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_00.blc b/blight-map/src/main/map/chunks/chunk_15_00.blc new file mode 100644 index 0000000..976568a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_01.blc b/blight-map/src/main/map/chunks/chunk_15_01.blc new file mode 100644 index 0000000..e9affbf Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_02.blc b/blight-map/src/main/map/chunks/chunk_15_02.blc new file mode 100644 index 0000000..fcb1011 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_03.blc b/blight-map/src/main/map/chunks/chunk_15_03.blc new file mode 100644 index 0000000..4f775c5 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_04.blc b/blight-map/src/main/map/chunks/chunk_15_04.blc new file mode 100644 index 0000000..7794a61 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_05.blc b/blight-map/src/main/map/chunks/chunk_15_05.blc new file mode 100644 index 0000000..17552a7 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_06.blc b/blight-map/src/main/map/chunks/chunk_15_06.blc new file mode 100644 index 0000000..36b4a0f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_07.blc b/blight-map/src/main/map/chunks/chunk_15_07.blc new file mode 100644 index 0000000..d48e407 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_08.blc b/blight-map/src/main/map/chunks/chunk_15_08.blc new file mode 100644 index 0000000..d9a3bd5 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_09.blc b/blight-map/src/main/map/chunks/chunk_15_09.blc new file mode 100644 index 0000000..4dddeb0 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_10.blc b/blight-map/src/main/map/chunks/chunk_15_10.blc new file mode 100644 index 0000000..6c456db Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_11.blc b/blight-map/src/main/map/chunks/chunk_15_11.blc new file mode 100644 index 0000000..5912ae3 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_12.blc b/blight-map/src/main/map/chunks/chunk_15_12.blc new file mode 100644 index 0000000..6ed5d9c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_13.blc b/blight-map/src/main/map/chunks/chunk_15_13.blc new file mode 100644 index 0000000..5dc17de Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_14.blc b/blight-map/src/main/map/chunks/chunk_15_14.blc new file mode 100644 index 0000000..fe3dc4e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_15.blc b/blight-map/src/main/map/chunks/chunk_15_15.blc new file mode 100644 index 0000000..aef956b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_16.blc b/blight-map/src/main/map/chunks/chunk_15_16.blc new file mode 100644 index 0000000..1cf8e1d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_17.blc b/blight-map/src/main/map/chunks/chunk_15_17.blc new file mode 100644 index 0000000..c758f8a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_18.blc b/blight-map/src/main/map/chunks/chunk_15_18.blc new file mode 100644 index 0000000..4f84c9b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_19.blc b/blight-map/src/main/map/chunks/chunk_15_19.blc new file mode 100644 index 0000000..736d13c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_20.blc b/blight-map/src/main/map/chunks/chunk_15_20.blc new file mode 100644 index 0000000..a89d29e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_21.blc b/blight-map/src/main/map/chunks/chunk_15_21.blc new file mode 100644 index 0000000..31d46ec Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_22.blc b/blight-map/src/main/map/chunks/chunk_15_22.blc new file mode 100644 index 0000000..79b510c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_23.blc b/blight-map/src/main/map/chunks/chunk_15_23.blc new file mode 100644 index 0000000..347f6d3 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_24.blc b/blight-map/src/main/map/chunks/chunk_15_24.blc new file mode 100644 index 0000000..b90ad54 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_25.blc b/blight-map/src/main/map/chunks/chunk_15_25.blc new file mode 100644 index 0000000..cf55cbb Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_26.blc b/blight-map/src/main/map/chunks/chunk_15_26.blc new file mode 100644 index 0000000..67a3c69 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_27.blc b/blight-map/src/main/map/chunks/chunk_15_27.blc new file mode 100644 index 0000000..3490117 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_28.blc b/blight-map/src/main/map/chunks/chunk_15_28.blc new file mode 100644 index 0000000..6f3eb2a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_29.blc b/blight-map/src/main/map/chunks/chunk_15_29.blc new file mode 100644 index 0000000..f289c7d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_30.blc b/blight-map/src/main/map/chunks/chunk_15_30.blc new file mode 100644 index 0000000..00de2bf Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_15_31.blc b/blight-map/src/main/map/chunks/chunk_15_31.blc new file mode 100644 index 0000000..41ebda7 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_15_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_00.blc b/blight-map/src/main/map/chunks/chunk_16_00.blc new file mode 100644 index 0000000..49dd8b3 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_01.blc b/blight-map/src/main/map/chunks/chunk_16_01.blc new file mode 100644 index 0000000..4e52462 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_02.blc b/blight-map/src/main/map/chunks/chunk_16_02.blc new file mode 100644 index 0000000..82d7b46 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_03.blc b/blight-map/src/main/map/chunks/chunk_16_03.blc new file mode 100644 index 0000000..72e773c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_04.blc b/blight-map/src/main/map/chunks/chunk_16_04.blc new file mode 100644 index 0000000..2384248 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_05.blc b/blight-map/src/main/map/chunks/chunk_16_05.blc new file mode 100644 index 0000000..3e75bfa Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_06.blc b/blight-map/src/main/map/chunks/chunk_16_06.blc new file mode 100644 index 0000000..50ce17e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_07.blc b/blight-map/src/main/map/chunks/chunk_16_07.blc new file mode 100644 index 0000000..bfa0bb0 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_08.blc b/blight-map/src/main/map/chunks/chunk_16_08.blc new file mode 100644 index 0000000..ccef952 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_09.blc b/blight-map/src/main/map/chunks/chunk_16_09.blc new file mode 100644 index 0000000..436d2e0 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_10.blc b/blight-map/src/main/map/chunks/chunk_16_10.blc new file mode 100644 index 0000000..e3d7d1b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_11.blc b/blight-map/src/main/map/chunks/chunk_16_11.blc new file mode 100644 index 0000000..3ad4529 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_12.blc b/blight-map/src/main/map/chunks/chunk_16_12.blc new file mode 100644 index 0000000..542f447 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_13.blc b/blight-map/src/main/map/chunks/chunk_16_13.blc new file mode 100644 index 0000000..856e0ba Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_14.blc b/blight-map/src/main/map/chunks/chunk_16_14.blc new file mode 100644 index 0000000..7e7cf40 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_15.blc b/blight-map/src/main/map/chunks/chunk_16_15.blc new file mode 100644 index 0000000..cbb7050 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_16.blc b/blight-map/src/main/map/chunks/chunk_16_16.blc new file mode 100644 index 0000000..32fa69d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_17.blc b/blight-map/src/main/map/chunks/chunk_16_17.blc new file mode 100644 index 0000000..049b35a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_18.blc b/blight-map/src/main/map/chunks/chunk_16_18.blc new file mode 100644 index 0000000..a335654 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_19.blc b/blight-map/src/main/map/chunks/chunk_16_19.blc new file mode 100644 index 0000000..40c6b07 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_20.blc b/blight-map/src/main/map/chunks/chunk_16_20.blc new file mode 100644 index 0000000..7e77eb9 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_21.blc b/blight-map/src/main/map/chunks/chunk_16_21.blc new file mode 100644 index 0000000..ab0a41c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_22.blc b/blight-map/src/main/map/chunks/chunk_16_22.blc new file mode 100644 index 0000000..671b8fa Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_23.blc b/blight-map/src/main/map/chunks/chunk_16_23.blc new file mode 100644 index 0000000..610ecbc Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_24.blc b/blight-map/src/main/map/chunks/chunk_16_24.blc new file mode 100644 index 0000000..e1f850b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_25.blc b/blight-map/src/main/map/chunks/chunk_16_25.blc new file mode 100644 index 0000000..dde6aeb Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_26.blc b/blight-map/src/main/map/chunks/chunk_16_26.blc new file mode 100644 index 0000000..e9a6a90 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_27.blc b/blight-map/src/main/map/chunks/chunk_16_27.blc new file mode 100644 index 0000000..6a4a458 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_28.blc b/blight-map/src/main/map/chunks/chunk_16_28.blc new file mode 100644 index 0000000..928ec5c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_29.blc b/blight-map/src/main/map/chunks/chunk_16_29.blc new file mode 100644 index 0000000..c86cb54 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_30.blc b/blight-map/src/main/map/chunks/chunk_16_30.blc new file mode 100644 index 0000000..241dcdd Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_16_31.blc b/blight-map/src/main/map/chunks/chunk_16_31.blc new file mode 100644 index 0000000..e870eac Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_16_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_00.blc b/blight-map/src/main/map/chunks/chunk_17_00.blc new file mode 100644 index 0000000..d218475 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_01.blc b/blight-map/src/main/map/chunks/chunk_17_01.blc new file mode 100644 index 0000000..e62ec3b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_02.blc b/blight-map/src/main/map/chunks/chunk_17_02.blc new file mode 100644 index 0000000..184e1d1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_03.blc b/blight-map/src/main/map/chunks/chunk_17_03.blc new file mode 100644 index 0000000..619caf3 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_04.blc b/blight-map/src/main/map/chunks/chunk_17_04.blc new file mode 100644 index 0000000..12416da Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_05.blc b/blight-map/src/main/map/chunks/chunk_17_05.blc new file mode 100644 index 0000000..3755b60 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_06.blc b/blight-map/src/main/map/chunks/chunk_17_06.blc new file mode 100644 index 0000000..2af5642 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_07.blc b/blight-map/src/main/map/chunks/chunk_17_07.blc new file mode 100644 index 0000000..400f066 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_08.blc b/blight-map/src/main/map/chunks/chunk_17_08.blc new file mode 100644 index 0000000..ed0a954 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_09.blc b/blight-map/src/main/map/chunks/chunk_17_09.blc new file mode 100644 index 0000000..2165adb Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_10.blc b/blight-map/src/main/map/chunks/chunk_17_10.blc new file mode 100644 index 0000000..c773a25 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_11.blc b/blight-map/src/main/map/chunks/chunk_17_11.blc new file mode 100644 index 0000000..db13994 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_12.blc b/blight-map/src/main/map/chunks/chunk_17_12.blc new file mode 100644 index 0000000..9063d21 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_13.blc b/blight-map/src/main/map/chunks/chunk_17_13.blc new file mode 100644 index 0000000..bdd8931 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_14.blc b/blight-map/src/main/map/chunks/chunk_17_14.blc new file mode 100644 index 0000000..37e3f74 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_15.blc b/blight-map/src/main/map/chunks/chunk_17_15.blc new file mode 100644 index 0000000..6b4283f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_16.blc b/blight-map/src/main/map/chunks/chunk_17_16.blc new file mode 100644 index 0000000..71dda1a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_17.blc b/blight-map/src/main/map/chunks/chunk_17_17.blc new file mode 100644 index 0000000..4e1747d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_18.blc b/blight-map/src/main/map/chunks/chunk_17_18.blc new file mode 100644 index 0000000..cd19b0f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_19.blc b/blight-map/src/main/map/chunks/chunk_17_19.blc new file mode 100644 index 0000000..064aa8f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_20.blc b/blight-map/src/main/map/chunks/chunk_17_20.blc new file mode 100644 index 0000000..0f6c5ea Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_21.blc b/blight-map/src/main/map/chunks/chunk_17_21.blc new file mode 100644 index 0000000..4efaf3c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_22.blc b/blight-map/src/main/map/chunks/chunk_17_22.blc new file mode 100644 index 0000000..9adf33e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_23.blc b/blight-map/src/main/map/chunks/chunk_17_23.blc new file mode 100644 index 0000000..51df440 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_24.blc b/blight-map/src/main/map/chunks/chunk_17_24.blc new file mode 100644 index 0000000..2f77ff0 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_25.blc b/blight-map/src/main/map/chunks/chunk_17_25.blc new file mode 100644 index 0000000..6128043 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_26.blc b/blight-map/src/main/map/chunks/chunk_17_26.blc new file mode 100644 index 0000000..3ba4233 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_27.blc b/blight-map/src/main/map/chunks/chunk_17_27.blc new file mode 100644 index 0000000..f23ac32 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_28.blc b/blight-map/src/main/map/chunks/chunk_17_28.blc new file mode 100644 index 0000000..ccdf52c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_29.blc b/blight-map/src/main/map/chunks/chunk_17_29.blc new file mode 100644 index 0000000..d105ea6 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_30.blc b/blight-map/src/main/map/chunks/chunk_17_30.blc new file mode 100644 index 0000000..de7a8f1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_17_31.blc b/blight-map/src/main/map/chunks/chunk_17_31.blc new file mode 100644 index 0000000..107980a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_17_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_00.blc b/blight-map/src/main/map/chunks/chunk_18_00.blc new file mode 100644 index 0000000..d56ea49 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_01.blc b/blight-map/src/main/map/chunks/chunk_18_01.blc new file mode 100644 index 0000000..8af9875 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_02.blc b/blight-map/src/main/map/chunks/chunk_18_02.blc new file mode 100644 index 0000000..c46dc8f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_03.blc b/blight-map/src/main/map/chunks/chunk_18_03.blc new file mode 100644 index 0000000..6e66d0d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_04.blc b/blight-map/src/main/map/chunks/chunk_18_04.blc new file mode 100644 index 0000000..645a14d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_05.blc b/blight-map/src/main/map/chunks/chunk_18_05.blc new file mode 100644 index 0000000..c4fe8ce Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_06.blc b/blight-map/src/main/map/chunks/chunk_18_06.blc new file mode 100644 index 0000000..ee1eec4 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_07.blc b/blight-map/src/main/map/chunks/chunk_18_07.blc new file mode 100644 index 0000000..362b19e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_08.blc b/blight-map/src/main/map/chunks/chunk_18_08.blc new file mode 100644 index 0000000..cdf168b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_09.blc b/blight-map/src/main/map/chunks/chunk_18_09.blc new file mode 100644 index 0000000..53b251a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_10.blc b/blight-map/src/main/map/chunks/chunk_18_10.blc new file mode 100644 index 0000000..9505076 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_11.blc b/blight-map/src/main/map/chunks/chunk_18_11.blc new file mode 100644 index 0000000..725f413 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_12.blc b/blight-map/src/main/map/chunks/chunk_18_12.blc new file mode 100644 index 0000000..656f8af Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_13.blc b/blight-map/src/main/map/chunks/chunk_18_13.blc new file mode 100644 index 0000000..c3bd64d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_14.blc b/blight-map/src/main/map/chunks/chunk_18_14.blc new file mode 100644 index 0000000..a203522 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_15.blc b/blight-map/src/main/map/chunks/chunk_18_15.blc new file mode 100644 index 0000000..8c96b99 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_16.blc b/blight-map/src/main/map/chunks/chunk_18_16.blc new file mode 100644 index 0000000..8c916e4 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_17.blc b/blight-map/src/main/map/chunks/chunk_18_17.blc new file mode 100644 index 0000000..4076a94 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_18.blc b/blight-map/src/main/map/chunks/chunk_18_18.blc new file mode 100644 index 0000000..fd50bbe Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_19.blc b/blight-map/src/main/map/chunks/chunk_18_19.blc new file mode 100644 index 0000000..59084a8 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_20.blc b/blight-map/src/main/map/chunks/chunk_18_20.blc new file mode 100644 index 0000000..0c90237 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_21.blc b/blight-map/src/main/map/chunks/chunk_18_21.blc new file mode 100644 index 0000000..77121d3 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_22.blc b/blight-map/src/main/map/chunks/chunk_18_22.blc new file mode 100644 index 0000000..18de1fa Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_23.blc b/blight-map/src/main/map/chunks/chunk_18_23.blc new file mode 100644 index 0000000..d293b09 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_24.blc b/blight-map/src/main/map/chunks/chunk_18_24.blc new file mode 100644 index 0000000..27171d8 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_25.blc b/blight-map/src/main/map/chunks/chunk_18_25.blc new file mode 100644 index 0000000..340ef34 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_26.blc b/blight-map/src/main/map/chunks/chunk_18_26.blc new file mode 100644 index 0000000..84f0499 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_27.blc b/blight-map/src/main/map/chunks/chunk_18_27.blc new file mode 100644 index 0000000..13428aa Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_28.blc b/blight-map/src/main/map/chunks/chunk_18_28.blc new file mode 100644 index 0000000..e952045 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_29.blc b/blight-map/src/main/map/chunks/chunk_18_29.blc new file mode 100644 index 0000000..2d73d4d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_30.blc b/blight-map/src/main/map/chunks/chunk_18_30.blc new file mode 100644 index 0000000..370d06f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_18_31.blc b/blight-map/src/main/map/chunks/chunk_18_31.blc new file mode 100644 index 0000000..91c856a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_18_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_00.blc b/blight-map/src/main/map/chunks/chunk_19_00.blc new file mode 100644 index 0000000..f9b6139 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_01.blc b/blight-map/src/main/map/chunks/chunk_19_01.blc new file mode 100644 index 0000000..549504d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_02.blc b/blight-map/src/main/map/chunks/chunk_19_02.blc new file mode 100644 index 0000000..43936e9 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_03.blc b/blight-map/src/main/map/chunks/chunk_19_03.blc new file mode 100644 index 0000000..b4da24f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_04.blc b/blight-map/src/main/map/chunks/chunk_19_04.blc new file mode 100644 index 0000000..6233b1b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_05.blc b/blight-map/src/main/map/chunks/chunk_19_05.blc new file mode 100644 index 0000000..deae1a3 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_06.blc b/blight-map/src/main/map/chunks/chunk_19_06.blc new file mode 100644 index 0000000..a31d2d7 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_07.blc b/blight-map/src/main/map/chunks/chunk_19_07.blc new file mode 100644 index 0000000..85f2a2b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_08.blc b/blight-map/src/main/map/chunks/chunk_19_08.blc new file mode 100644 index 0000000..b28ed04 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_09.blc b/blight-map/src/main/map/chunks/chunk_19_09.blc new file mode 100644 index 0000000..de0a735 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_10.blc b/blight-map/src/main/map/chunks/chunk_19_10.blc new file mode 100644 index 0000000..3c3564a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_11.blc b/blight-map/src/main/map/chunks/chunk_19_11.blc new file mode 100644 index 0000000..b7757d6 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_12.blc b/blight-map/src/main/map/chunks/chunk_19_12.blc new file mode 100644 index 0000000..e748fda Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_13.blc b/blight-map/src/main/map/chunks/chunk_19_13.blc new file mode 100644 index 0000000..29e677a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_14.blc b/blight-map/src/main/map/chunks/chunk_19_14.blc new file mode 100644 index 0000000..4fe6c4c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_15.blc b/blight-map/src/main/map/chunks/chunk_19_15.blc new file mode 100644 index 0000000..595d177 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_16.blc b/blight-map/src/main/map/chunks/chunk_19_16.blc new file mode 100644 index 0000000..27dd33a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_17.blc b/blight-map/src/main/map/chunks/chunk_19_17.blc new file mode 100644 index 0000000..122cb66 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_18.blc b/blight-map/src/main/map/chunks/chunk_19_18.blc new file mode 100644 index 0000000..19e6a94 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_19.blc b/blight-map/src/main/map/chunks/chunk_19_19.blc new file mode 100644 index 0000000..44374c7 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_20.blc b/blight-map/src/main/map/chunks/chunk_19_20.blc new file mode 100644 index 0000000..b4db522 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_21.blc b/blight-map/src/main/map/chunks/chunk_19_21.blc new file mode 100644 index 0000000..57f6f0e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_22.blc b/blight-map/src/main/map/chunks/chunk_19_22.blc new file mode 100644 index 0000000..3d56288 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_23.blc b/blight-map/src/main/map/chunks/chunk_19_23.blc new file mode 100644 index 0000000..faf274b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_24.blc b/blight-map/src/main/map/chunks/chunk_19_24.blc new file mode 100644 index 0000000..d663b73 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_25.blc b/blight-map/src/main/map/chunks/chunk_19_25.blc new file mode 100644 index 0000000..ac46f02 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_26.blc b/blight-map/src/main/map/chunks/chunk_19_26.blc new file mode 100644 index 0000000..cb12bac Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_27.blc b/blight-map/src/main/map/chunks/chunk_19_27.blc new file mode 100644 index 0000000..1862e16 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_28.blc b/blight-map/src/main/map/chunks/chunk_19_28.blc new file mode 100644 index 0000000..cfd77b5 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_29.blc b/blight-map/src/main/map/chunks/chunk_19_29.blc new file mode 100644 index 0000000..3670fe3 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_30.blc b/blight-map/src/main/map/chunks/chunk_19_30.blc new file mode 100644 index 0000000..049afea Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_19_31.blc b/blight-map/src/main/map/chunks/chunk_19_31.blc new file mode 100644 index 0000000..478b907 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_19_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_00.blc b/blight-map/src/main/map/chunks/chunk_20_00.blc new file mode 100644 index 0000000..b1abe1e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_01.blc b/blight-map/src/main/map/chunks/chunk_20_01.blc new file mode 100644 index 0000000..67f54aa Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_02.blc b/blight-map/src/main/map/chunks/chunk_20_02.blc new file mode 100644 index 0000000..e9f38d8 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_03.blc b/blight-map/src/main/map/chunks/chunk_20_03.blc new file mode 100644 index 0000000..be25614 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_04.blc b/blight-map/src/main/map/chunks/chunk_20_04.blc new file mode 100644 index 0000000..cf61c69 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_05.blc b/blight-map/src/main/map/chunks/chunk_20_05.blc new file mode 100644 index 0000000..39f7941 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_06.blc b/blight-map/src/main/map/chunks/chunk_20_06.blc new file mode 100644 index 0000000..51cc0f0 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_07.blc b/blight-map/src/main/map/chunks/chunk_20_07.blc new file mode 100644 index 0000000..c9545e6 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_08.blc b/blight-map/src/main/map/chunks/chunk_20_08.blc new file mode 100644 index 0000000..dbdc9cf Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_09.blc b/blight-map/src/main/map/chunks/chunk_20_09.blc new file mode 100644 index 0000000..0a0cd9b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_10.blc b/blight-map/src/main/map/chunks/chunk_20_10.blc new file mode 100644 index 0000000..cd8c19c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_11.blc b/blight-map/src/main/map/chunks/chunk_20_11.blc new file mode 100644 index 0000000..461297b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_12.blc b/blight-map/src/main/map/chunks/chunk_20_12.blc new file mode 100644 index 0000000..f6bfd64 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_13.blc b/blight-map/src/main/map/chunks/chunk_20_13.blc new file mode 100644 index 0000000..c41f22b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_14.blc b/blight-map/src/main/map/chunks/chunk_20_14.blc new file mode 100644 index 0000000..bf1d9f0 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_15.blc b/blight-map/src/main/map/chunks/chunk_20_15.blc new file mode 100644 index 0000000..a40e13a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_16.blc b/blight-map/src/main/map/chunks/chunk_20_16.blc new file mode 100644 index 0000000..dedab93 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_17.blc b/blight-map/src/main/map/chunks/chunk_20_17.blc new file mode 100644 index 0000000..21ba4c0 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_18.blc b/blight-map/src/main/map/chunks/chunk_20_18.blc new file mode 100644 index 0000000..8166c2a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_19.blc b/blight-map/src/main/map/chunks/chunk_20_19.blc new file mode 100644 index 0000000..550b2e4 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_20.blc b/blight-map/src/main/map/chunks/chunk_20_20.blc new file mode 100644 index 0000000..033b987 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_21.blc b/blight-map/src/main/map/chunks/chunk_20_21.blc new file mode 100644 index 0000000..0348752 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_22.blc b/blight-map/src/main/map/chunks/chunk_20_22.blc new file mode 100644 index 0000000..e7e859b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_23.blc b/blight-map/src/main/map/chunks/chunk_20_23.blc new file mode 100644 index 0000000..37e5cb2 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_24.blc b/blight-map/src/main/map/chunks/chunk_20_24.blc new file mode 100644 index 0000000..90c7b62 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_25.blc b/blight-map/src/main/map/chunks/chunk_20_25.blc new file mode 100644 index 0000000..7f08394 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_26.blc b/blight-map/src/main/map/chunks/chunk_20_26.blc new file mode 100644 index 0000000..b487998 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_27.blc b/blight-map/src/main/map/chunks/chunk_20_27.blc new file mode 100644 index 0000000..2bdfd95 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_28.blc b/blight-map/src/main/map/chunks/chunk_20_28.blc new file mode 100644 index 0000000..ff73373 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_29.blc b/blight-map/src/main/map/chunks/chunk_20_29.blc new file mode 100644 index 0000000..efa95f5 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_30.blc b/blight-map/src/main/map/chunks/chunk_20_30.blc new file mode 100644 index 0000000..98cb2c4 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_20_31.blc b/blight-map/src/main/map/chunks/chunk_20_31.blc new file mode 100644 index 0000000..f9428cd Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_20_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_00.blc b/blight-map/src/main/map/chunks/chunk_21_00.blc new file mode 100644 index 0000000..94db14d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_01.blc b/blight-map/src/main/map/chunks/chunk_21_01.blc new file mode 100644 index 0000000..8b6c109 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_02.blc b/blight-map/src/main/map/chunks/chunk_21_02.blc new file mode 100644 index 0000000..4f4ebfb Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_03.blc b/blight-map/src/main/map/chunks/chunk_21_03.blc new file mode 100644 index 0000000..4fc9088 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_04.blc b/blight-map/src/main/map/chunks/chunk_21_04.blc new file mode 100644 index 0000000..c2cc971 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_05.blc b/blight-map/src/main/map/chunks/chunk_21_05.blc new file mode 100644 index 0000000..e7d3f29 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_06.blc b/blight-map/src/main/map/chunks/chunk_21_06.blc new file mode 100644 index 0000000..45944c0 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_07.blc b/blight-map/src/main/map/chunks/chunk_21_07.blc new file mode 100644 index 0000000..a8f9ad0 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_08.blc b/blight-map/src/main/map/chunks/chunk_21_08.blc new file mode 100644 index 0000000..ddb54a5 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_09.blc b/blight-map/src/main/map/chunks/chunk_21_09.blc new file mode 100644 index 0000000..2fdd8f2 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_10.blc b/blight-map/src/main/map/chunks/chunk_21_10.blc new file mode 100644 index 0000000..95e7fbb Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_11.blc b/blight-map/src/main/map/chunks/chunk_21_11.blc new file mode 100644 index 0000000..37e8e58 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_12.blc b/blight-map/src/main/map/chunks/chunk_21_12.blc new file mode 100644 index 0000000..2d621f5 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_13.blc b/blight-map/src/main/map/chunks/chunk_21_13.blc new file mode 100644 index 0000000..f9813b8 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_14.blc b/blight-map/src/main/map/chunks/chunk_21_14.blc new file mode 100644 index 0000000..e344772 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_15.blc b/blight-map/src/main/map/chunks/chunk_21_15.blc new file mode 100644 index 0000000..28f7f14 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_16.blc b/blight-map/src/main/map/chunks/chunk_21_16.blc new file mode 100644 index 0000000..e525c01 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_17.blc b/blight-map/src/main/map/chunks/chunk_21_17.blc new file mode 100644 index 0000000..cd96f7e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_18.blc b/blight-map/src/main/map/chunks/chunk_21_18.blc new file mode 100644 index 0000000..c0d9e0d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_19.blc b/blight-map/src/main/map/chunks/chunk_21_19.blc new file mode 100644 index 0000000..af02572 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_20.blc b/blight-map/src/main/map/chunks/chunk_21_20.blc new file mode 100644 index 0000000..9c38507 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_21.blc b/blight-map/src/main/map/chunks/chunk_21_21.blc new file mode 100644 index 0000000..31af0b6 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_22.blc b/blight-map/src/main/map/chunks/chunk_21_22.blc new file mode 100644 index 0000000..3c0538f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_23.blc b/blight-map/src/main/map/chunks/chunk_21_23.blc new file mode 100644 index 0000000..732e64f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_24.blc b/blight-map/src/main/map/chunks/chunk_21_24.blc new file mode 100644 index 0000000..eb77004 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_25.blc b/blight-map/src/main/map/chunks/chunk_21_25.blc new file mode 100644 index 0000000..69550bb Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_26.blc b/blight-map/src/main/map/chunks/chunk_21_26.blc new file mode 100644 index 0000000..2504ab0 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_27.blc b/blight-map/src/main/map/chunks/chunk_21_27.blc new file mode 100644 index 0000000..d596480 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_28.blc b/blight-map/src/main/map/chunks/chunk_21_28.blc new file mode 100644 index 0000000..6b87471 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_29.blc b/blight-map/src/main/map/chunks/chunk_21_29.blc new file mode 100644 index 0000000..3b7eb66 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_30.blc b/blight-map/src/main/map/chunks/chunk_21_30.blc new file mode 100644 index 0000000..839d540 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_21_31.blc b/blight-map/src/main/map/chunks/chunk_21_31.blc new file mode 100644 index 0000000..0a08bc3 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_21_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_00.blc b/blight-map/src/main/map/chunks/chunk_22_00.blc new file mode 100644 index 0000000..fd0b65c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_01.blc b/blight-map/src/main/map/chunks/chunk_22_01.blc new file mode 100644 index 0000000..f392751 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_02.blc b/blight-map/src/main/map/chunks/chunk_22_02.blc new file mode 100644 index 0000000..bf82c3b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_03.blc b/blight-map/src/main/map/chunks/chunk_22_03.blc new file mode 100644 index 0000000..1a2f2e1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_04.blc b/blight-map/src/main/map/chunks/chunk_22_04.blc new file mode 100644 index 0000000..ea5a486 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_05.blc b/blight-map/src/main/map/chunks/chunk_22_05.blc new file mode 100644 index 0000000..b4537cc Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_06.blc b/blight-map/src/main/map/chunks/chunk_22_06.blc new file mode 100644 index 0000000..b2ed6ac Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_07.blc b/blight-map/src/main/map/chunks/chunk_22_07.blc new file mode 100644 index 0000000..100cf92 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_08.blc b/blight-map/src/main/map/chunks/chunk_22_08.blc new file mode 100644 index 0000000..ad8db3b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_09.blc b/blight-map/src/main/map/chunks/chunk_22_09.blc new file mode 100644 index 0000000..92bcade Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_10.blc b/blight-map/src/main/map/chunks/chunk_22_10.blc new file mode 100644 index 0000000..ad653e4 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_11.blc b/blight-map/src/main/map/chunks/chunk_22_11.blc new file mode 100644 index 0000000..895bf39 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_12.blc b/blight-map/src/main/map/chunks/chunk_22_12.blc new file mode 100644 index 0000000..2dc89e0 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_13.blc b/blight-map/src/main/map/chunks/chunk_22_13.blc new file mode 100644 index 0000000..e17aa8d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_14.blc b/blight-map/src/main/map/chunks/chunk_22_14.blc new file mode 100644 index 0000000..c5248dc Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_15.blc b/blight-map/src/main/map/chunks/chunk_22_15.blc new file mode 100644 index 0000000..b24ba1a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_16.blc b/blight-map/src/main/map/chunks/chunk_22_16.blc new file mode 100644 index 0000000..0eba84c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_17.blc b/blight-map/src/main/map/chunks/chunk_22_17.blc new file mode 100644 index 0000000..761aaf4 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_18.blc b/blight-map/src/main/map/chunks/chunk_22_18.blc new file mode 100644 index 0000000..3a7b455 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_19.blc b/blight-map/src/main/map/chunks/chunk_22_19.blc new file mode 100644 index 0000000..0d16f20 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_20.blc b/blight-map/src/main/map/chunks/chunk_22_20.blc new file mode 100644 index 0000000..d5e8971 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_21.blc b/blight-map/src/main/map/chunks/chunk_22_21.blc new file mode 100644 index 0000000..b0d9377 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_22.blc b/blight-map/src/main/map/chunks/chunk_22_22.blc new file mode 100644 index 0000000..34a9399 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_23.blc b/blight-map/src/main/map/chunks/chunk_22_23.blc new file mode 100644 index 0000000..b840885 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_24.blc b/blight-map/src/main/map/chunks/chunk_22_24.blc new file mode 100644 index 0000000..f901dc1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_25.blc b/blight-map/src/main/map/chunks/chunk_22_25.blc new file mode 100644 index 0000000..0631c3e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_26.blc b/blight-map/src/main/map/chunks/chunk_22_26.blc new file mode 100644 index 0000000..7d8e8c9 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_27.blc b/blight-map/src/main/map/chunks/chunk_22_27.blc new file mode 100644 index 0000000..143a3a8 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_28.blc b/blight-map/src/main/map/chunks/chunk_22_28.blc new file mode 100644 index 0000000..97eac5e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_29.blc b/blight-map/src/main/map/chunks/chunk_22_29.blc new file mode 100644 index 0000000..e7c2ae1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_30.blc b/blight-map/src/main/map/chunks/chunk_22_30.blc new file mode 100644 index 0000000..da32ff3 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_22_31.blc b/blight-map/src/main/map/chunks/chunk_22_31.blc new file mode 100644 index 0000000..310ceab Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_22_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_00.blc b/blight-map/src/main/map/chunks/chunk_23_00.blc new file mode 100644 index 0000000..a73fa50 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_01.blc b/blight-map/src/main/map/chunks/chunk_23_01.blc new file mode 100644 index 0000000..8d8e414 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_02.blc b/blight-map/src/main/map/chunks/chunk_23_02.blc new file mode 100644 index 0000000..b30ce60 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_03.blc b/blight-map/src/main/map/chunks/chunk_23_03.blc new file mode 100644 index 0000000..26f7423 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_04.blc b/blight-map/src/main/map/chunks/chunk_23_04.blc new file mode 100644 index 0000000..6a3374a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_05.blc b/blight-map/src/main/map/chunks/chunk_23_05.blc new file mode 100644 index 0000000..7db5a0d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_06.blc b/blight-map/src/main/map/chunks/chunk_23_06.blc new file mode 100644 index 0000000..ea02d37 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_07.blc b/blight-map/src/main/map/chunks/chunk_23_07.blc new file mode 100644 index 0000000..e59e446 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_08.blc b/blight-map/src/main/map/chunks/chunk_23_08.blc new file mode 100644 index 0000000..48b6c67 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_09.blc b/blight-map/src/main/map/chunks/chunk_23_09.blc new file mode 100644 index 0000000..8fedca1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_10.blc b/blight-map/src/main/map/chunks/chunk_23_10.blc new file mode 100644 index 0000000..c52e3cc Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_11.blc b/blight-map/src/main/map/chunks/chunk_23_11.blc new file mode 100644 index 0000000..caa9f93 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_12.blc b/blight-map/src/main/map/chunks/chunk_23_12.blc new file mode 100644 index 0000000..91e0abe Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_13.blc b/blight-map/src/main/map/chunks/chunk_23_13.blc new file mode 100644 index 0000000..dd2d360 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_14.blc b/blight-map/src/main/map/chunks/chunk_23_14.blc new file mode 100644 index 0000000..a486069 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_15.blc b/blight-map/src/main/map/chunks/chunk_23_15.blc new file mode 100644 index 0000000..00c6460 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_16.blc b/blight-map/src/main/map/chunks/chunk_23_16.blc new file mode 100644 index 0000000..de5411e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_17.blc b/blight-map/src/main/map/chunks/chunk_23_17.blc new file mode 100644 index 0000000..174170e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_18.blc b/blight-map/src/main/map/chunks/chunk_23_18.blc new file mode 100644 index 0000000..ab8e6d9 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_19.blc b/blight-map/src/main/map/chunks/chunk_23_19.blc new file mode 100644 index 0000000..1fbfbb9 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_20.blc b/blight-map/src/main/map/chunks/chunk_23_20.blc new file mode 100644 index 0000000..d901445 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_21.blc b/blight-map/src/main/map/chunks/chunk_23_21.blc new file mode 100644 index 0000000..e65ba88 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_22.blc b/blight-map/src/main/map/chunks/chunk_23_22.blc new file mode 100644 index 0000000..6ca780d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_23.blc b/blight-map/src/main/map/chunks/chunk_23_23.blc new file mode 100644 index 0000000..c9a9381 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_24.blc b/blight-map/src/main/map/chunks/chunk_23_24.blc new file mode 100644 index 0000000..b781017 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_25.blc b/blight-map/src/main/map/chunks/chunk_23_25.blc new file mode 100644 index 0000000..36d29aa Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_26.blc b/blight-map/src/main/map/chunks/chunk_23_26.blc new file mode 100644 index 0000000..97b6dda Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_27.blc b/blight-map/src/main/map/chunks/chunk_23_27.blc new file mode 100644 index 0000000..59eb943 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_28.blc b/blight-map/src/main/map/chunks/chunk_23_28.blc new file mode 100644 index 0000000..af08de5 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_29.blc b/blight-map/src/main/map/chunks/chunk_23_29.blc new file mode 100644 index 0000000..05280ad Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_30.blc b/blight-map/src/main/map/chunks/chunk_23_30.blc new file mode 100644 index 0000000..aabe80e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_23_31.blc b/blight-map/src/main/map/chunks/chunk_23_31.blc new file mode 100644 index 0000000..ad51579 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_23_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_00.blc b/blight-map/src/main/map/chunks/chunk_24_00.blc new file mode 100644 index 0000000..0e8b7de Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_01.blc b/blight-map/src/main/map/chunks/chunk_24_01.blc new file mode 100644 index 0000000..015825b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_02.blc b/blight-map/src/main/map/chunks/chunk_24_02.blc new file mode 100644 index 0000000..74ba10e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_03.blc b/blight-map/src/main/map/chunks/chunk_24_03.blc new file mode 100644 index 0000000..e1cd3e9 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_04.blc b/blight-map/src/main/map/chunks/chunk_24_04.blc new file mode 100644 index 0000000..733e3a1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_05.blc b/blight-map/src/main/map/chunks/chunk_24_05.blc new file mode 100644 index 0000000..b6c11a0 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_06.blc b/blight-map/src/main/map/chunks/chunk_24_06.blc new file mode 100644 index 0000000..279ea02 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_07.blc b/blight-map/src/main/map/chunks/chunk_24_07.blc new file mode 100644 index 0000000..27dc519 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_08.blc b/blight-map/src/main/map/chunks/chunk_24_08.blc new file mode 100644 index 0000000..f48bdf1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_09.blc b/blight-map/src/main/map/chunks/chunk_24_09.blc new file mode 100644 index 0000000..214520d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_10.blc b/blight-map/src/main/map/chunks/chunk_24_10.blc new file mode 100644 index 0000000..c0f059d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_11.blc b/blight-map/src/main/map/chunks/chunk_24_11.blc new file mode 100644 index 0000000..c99bc57 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_12.blc b/blight-map/src/main/map/chunks/chunk_24_12.blc new file mode 100644 index 0000000..b9b1e09 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_13.blc b/blight-map/src/main/map/chunks/chunk_24_13.blc new file mode 100644 index 0000000..482aa24 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_14.blc b/blight-map/src/main/map/chunks/chunk_24_14.blc new file mode 100644 index 0000000..f00f8dd Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_15.blc b/blight-map/src/main/map/chunks/chunk_24_15.blc new file mode 100644 index 0000000..86b3d7c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_16.blc b/blight-map/src/main/map/chunks/chunk_24_16.blc new file mode 100644 index 0000000..726f13d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_17.blc b/blight-map/src/main/map/chunks/chunk_24_17.blc new file mode 100644 index 0000000..2c1b365 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_18.blc b/blight-map/src/main/map/chunks/chunk_24_18.blc new file mode 100644 index 0000000..92ec10e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_19.blc b/blight-map/src/main/map/chunks/chunk_24_19.blc new file mode 100644 index 0000000..3bc4afb Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_20.blc b/blight-map/src/main/map/chunks/chunk_24_20.blc new file mode 100644 index 0000000..2f4da25 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_21.blc b/blight-map/src/main/map/chunks/chunk_24_21.blc new file mode 100644 index 0000000..2011ed1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_22.blc b/blight-map/src/main/map/chunks/chunk_24_22.blc new file mode 100644 index 0000000..ab05c9c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_23.blc b/blight-map/src/main/map/chunks/chunk_24_23.blc new file mode 100644 index 0000000..16b497f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_24.blc b/blight-map/src/main/map/chunks/chunk_24_24.blc new file mode 100644 index 0000000..d92267a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_25.blc b/blight-map/src/main/map/chunks/chunk_24_25.blc new file mode 100644 index 0000000..3c711e0 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_26.blc b/blight-map/src/main/map/chunks/chunk_24_26.blc new file mode 100644 index 0000000..e78fe83 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_27.blc b/blight-map/src/main/map/chunks/chunk_24_27.blc new file mode 100644 index 0000000..0e5fe63 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_28.blc b/blight-map/src/main/map/chunks/chunk_24_28.blc new file mode 100644 index 0000000..3dd32c3 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_29.blc b/blight-map/src/main/map/chunks/chunk_24_29.blc new file mode 100644 index 0000000..b94a132 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_30.blc b/blight-map/src/main/map/chunks/chunk_24_30.blc new file mode 100644 index 0000000..6bc6ed8 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_24_31.blc b/blight-map/src/main/map/chunks/chunk_24_31.blc new file mode 100644 index 0000000..c2f7ffb Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_24_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_00.blc b/blight-map/src/main/map/chunks/chunk_25_00.blc new file mode 100644 index 0000000..3422f05 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_01.blc b/blight-map/src/main/map/chunks/chunk_25_01.blc new file mode 100644 index 0000000..da5f1c9 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_02.blc b/blight-map/src/main/map/chunks/chunk_25_02.blc new file mode 100644 index 0000000..e5ccbcc Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_03.blc b/blight-map/src/main/map/chunks/chunk_25_03.blc new file mode 100644 index 0000000..08e445b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_04.blc b/blight-map/src/main/map/chunks/chunk_25_04.blc new file mode 100644 index 0000000..bca21c8 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_05.blc b/blight-map/src/main/map/chunks/chunk_25_05.blc new file mode 100644 index 0000000..bc62a04 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_06.blc b/blight-map/src/main/map/chunks/chunk_25_06.blc new file mode 100644 index 0000000..91b726c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_07.blc b/blight-map/src/main/map/chunks/chunk_25_07.blc new file mode 100644 index 0000000..21368f8 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_08.blc b/blight-map/src/main/map/chunks/chunk_25_08.blc new file mode 100644 index 0000000..895986d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_09.blc b/blight-map/src/main/map/chunks/chunk_25_09.blc new file mode 100644 index 0000000..abcb39b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_10.blc b/blight-map/src/main/map/chunks/chunk_25_10.blc new file mode 100644 index 0000000..94f46d1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_11.blc b/blight-map/src/main/map/chunks/chunk_25_11.blc new file mode 100644 index 0000000..76def4f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_12.blc b/blight-map/src/main/map/chunks/chunk_25_12.blc new file mode 100644 index 0000000..4ede269 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_13.blc b/blight-map/src/main/map/chunks/chunk_25_13.blc new file mode 100644 index 0000000..09be280 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_14.blc b/blight-map/src/main/map/chunks/chunk_25_14.blc new file mode 100644 index 0000000..6b296da Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_15.blc b/blight-map/src/main/map/chunks/chunk_25_15.blc new file mode 100644 index 0000000..ce469e4 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_16.blc b/blight-map/src/main/map/chunks/chunk_25_16.blc new file mode 100644 index 0000000..a4fd897 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_17.blc b/blight-map/src/main/map/chunks/chunk_25_17.blc new file mode 100644 index 0000000..683bda9 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_18.blc b/blight-map/src/main/map/chunks/chunk_25_18.blc new file mode 100644 index 0000000..c11e31f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_19.blc b/blight-map/src/main/map/chunks/chunk_25_19.blc new file mode 100644 index 0000000..340706d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_20.blc b/blight-map/src/main/map/chunks/chunk_25_20.blc new file mode 100644 index 0000000..5a4e37b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_21.blc b/blight-map/src/main/map/chunks/chunk_25_21.blc new file mode 100644 index 0000000..1b79d47 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_22.blc b/blight-map/src/main/map/chunks/chunk_25_22.blc new file mode 100644 index 0000000..61bdab5 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_23.blc b/blight-map/src/main/map/chunks/chunk_25_23.blc new file mode 100644 index 0000000..f33f10c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_24.blc b/blight-map/src/main/map/chunks/chunk_25_24.blc new file mode 100644 index 0000000..c594c80 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_25.blc b/blight-map/src/main/map/chunks/chunk_25_25.blc new file mode 100644 index 0000000..806533e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_26.blc b/blight-map/src/main/map/chunks/chunk_25_26.blc new file mode 100644 index 0000000..48cd6eb Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_27.blc b/blight-map/src/main/map/chunks/chunk_25_27.blc new file mode 100644 index 0000000..435d3e2 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_28.blc b/blight-map/src/main/map/chunks/chunk_25_28.blc new file mode 100644 index 0000000..5db302e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_29.blc b/blight-map/src/main/map/chunks/chunk_25_29.blc new file mode 100644 index 0000000..4b25d51 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_30.blc b/blight-map/src/main/map/chunks/chunk_25_30.blc new file mode 100644 index 0000000..644aadf Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_25_31.blc b/blight-map/src/main/map/chunks/chunk_25_31.blc new file mode 100644 index 0000000..78fbbb6 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_25_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_00.blc b/blight-map/src/main/map/chunks/chunk_26_00.blc new file mode 100644 index 0000000..715225c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_01.blc b/blight-map/src/main/map/chunks/chunk_26_01.blc new file mode 100644 index 0000000..56f43dc Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_02.blc b/blight-map/src/main/map/chunks/chunk_26_02.blc new file mode 100644 index 0000000..f220d02 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_03.blc b/blight-map/src/main/map/chunks/chunk_26_03.blc new file mode 100644 index 0000000..a2c3394 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_04.blc b/blight-map/src/main/map/chunks/chunk_26_04.blc new file mode 100644 index 0000000..2b07db0 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_05.blc b/blight-map/src/main/map/chunks/chunk_26_05.blc new file mode 100644 index 0000000..6a36073 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_06.blc b/blight-map/src/main/map/chunks/chunk_26_06.blc new file mode 100644 index 0000000..b9ca94d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_07.blc b/blight-map/src/main/map/chunks/chunk_26_07.blc new file mode 100644 index 0000000..eefaf4d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_08.blc b/blight-map/src/main/map/chunks/chunk_26_08.blc new file mode 100644 index 0000000..6f602a8 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_09.blc b/blight-map/src/main/map/chunks/chunk_26_09.blc new file mode 100644 index 0000000..89769d7 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_10.blc b/blight-map/src/main/map/chunks/chunk_26_10.blc new file mode 100644 index 0000000..8c80541 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_11.blc b/blight-map/src/main/map/chunks/chunk_26_11.blc new file mode 100644 index 0000000..a950782 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_12.blc b/blight-map/src/main/map/chunks/chunk_26_12.blc new file mode 100644 index 0000000..c8b0853 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_13.blc b/blight-map/src/main/map/chunks/chunk_26_13.blc new file mode 100644 index 0000000..5677975 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_14.blc b/blight-map/src/main/map/chunks/chunk_26_14.blc new file mode 100644 index 0000000..b306166 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_15.blc b/blight-map/src/main/map/chunks/chunk_26_15.blc new file mode 100644 index 0000000..0d6d192 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_16.blc b/blight-map/src/main/map/chunks/chunk_26_16.blc new file mode 100644 index 0000000..48d8f9c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_17.blc b/blight-map/src/main/map/chunks/chunk_26_17.blc new file mode 100644 index 0000000..78c040d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_18.blc b/blight-map/src/main/map/chunks/chunk_26_18.blc new file mode 100644 index 0000000..e7ad6d0 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_19.blc b/blight-map/src/main/map/chunks/chunk_26_19.blc new file mode 100644 index 0000000..6b71e7e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_20.blc b/blight-map/src/main/map/chunks/chunk_26_20.blc new file mode 100644 index 0000000..138ae51 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_21.blc b/blight-map/src/main/map/chunks/chunk_26_21.blc new file mode 100644 index 0000000..a81d6c7 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_22.blc b/blight-map/src/main/map/chunks/chunk_26_22.blc new file mode 100644 index 0000000..5371804 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_23.blc b/blight-map/src/main/map/chunks/chunk_26_23.blc new file mode 100644 index 0000000..3f95182 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_24.blc b/blight-map/src/main/map/chunks/chunk_26_24.blc new file mode 100644 index 0000000..754f64d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_25.blc b/blight-map/src/main/map/chunks/chunk_26_25.blc new file mode 100644 index 0000000..4495631 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_26.blc b/blight-map/src/main/map/chunks/chunk_26_26.blc new file mode 100644 index 0000000..9253950 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_27.blc b/blight-map/src/main/map/chunks/chunk_26_27.blc new file mode 100644 index 0000000..b855cdc Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_28.blc b/blight-map/src/main/map/chunks/chunk_26_28.blc new file mode 100644 index 0000000..d5d2631 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_29.blc b/blight-map/src/main/map/chunks/chunk_26_29.blc new file mode 100644 index 0000000..3c87804 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_30.blc b/blight-map/src/main/map/chunks/chunk_26_30.blc new file mode 100644 index 0000000..523cefa Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_26_31.blc b/blight-map/src/main/map/chunks/chunk_26_31.blc new file mode 100644 index 0000000..b89d56b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_26_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_00.blc b/blight-map/src/main/map/chunks/chunk_27_00.blc new file mode 100644 index 0000000..25fdd4f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_01.blc b/blight-map/src/main/map/chunks/chunk_27_01.blc new file mode 100644 index 0000000..7147356 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_02.blc b/blight-map/src/main/map/chunks/chunk_27_02.blc new file mode 100644 index 0000000..743d81f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_03.blc b/blight-map/src/main/map/chunks/chunk_27_03.blc new file mode 100644 index 0000000..56eb1e8 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_04.blc b/blight-map/src/main/map/chunks/chunk_27_04.blc new file mode 100644 index 0000000..fa6514c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_05.blc b/blight-map/src/main/map/chunks/chunk_27_05.blc new file mode 100644 index 0000000..c8a3800 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_06.blc b/blight-map/src/main/map/chunks/chunk_27_06.blc new file mode 100644 index 0000000..734de45 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_07.blc b/blight-map/src/main/map/chunks/chunk_27_07.blc new file mode 100644 index 0000000..4a029b0 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_08.blc b/blight-map/src/main/map/chunks/chunk_27_08.blc new file mode 100644 index 0000000..5fda7ee Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_09.blc b/blight-map/src/main/map/chunks/chunk_27_09.blc new file mode 100644 index 0000000..a54fd53 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_10.blc b/blight-map/src/main/map/chunks/chunk_27_10.blc new file mode 100644 index 0000000..282aaec Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_11.blc b/blight-map/src/main/map/chunks/chunk_27_11.blc new file mode 100644 index 0000000..304cb92 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_12.blc b/blight-map/src/main/map/chunks/chunk_27_12.blc new file mode 100644 index 0000000..a76b854 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_13.blc b/blight-map/src/main/map/chunks/chunk_27_13.blc new file mode 100644 index 0000000..c2edfbd Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_14.blc b/blight-map/src/main/map/chunks/chunk_27_14.blc new file mode 100644 index 0000000..f722b75 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_15.blc b/blight-map/src/main/map/chunks/chunk_27_15.blc new file mode 100644 index 0000000..c17be18 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_16.blc b/blight-map/src/main/map/chunks/chunk_27_16.blc new file mode 100644 index 0000000..5873ad4 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_17.blc b/blight-map/src/main/map/chunks/chunk_27_17.blc new file mode 100644 index 0000000..431ab3d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_18.blc b/blight-map/src/main/map/chunks/chunk_27_18.blc new file mode 100644 index 0000000..be4a76d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_19.blc b/blight-map/src/main/map/chunks/chunk_27_19.blc new file mode 100644 index 0000000..8faa44e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_20.blc b/blight-map/src/main/map/chunks/chunk_27_20.blc new file mode 100644 index 0000000..9230c47 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_21.blc b/blight-map/src/main/map/chunks/chunk_27_21.blc new file mode 100644 index 0000000..f255134 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_22.blc b/blight-map/src/main/map/chunks/chunk_27_22.blc new file mode 100644 index 0000000..724a0b5 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_23.blc b/blight-map/src/main/map/chunks/chunk_27_23.blc new file mode 100644 index 0000000..825d3ff Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_24.blc b/blight-map/src/main/map/chunks/chunk_27_24.blc new file mode 100644 index 0000000..c25ddd4 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_25.blc b/blight-map/src/main/map/chunks/chunk_27_25.blc new file mode 100644 index 0000000..040d2ac Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_26.blc b/blight-map/src/main/map/chunks/chunk_27_26.blc new file mode 100644 index 0000000..23fde9f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_27.blc b/blight-map/src/main/map/chunks/chunk_27_27.blc new file mode 100644 index 0000000..5074d42 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_28.blc b/blight-map/src/main/map/chunks/chunk_27_28.blc new file mode 100644 index 0000000..4d2bd85 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_29.blc b/blight-map/src/main/map/chunks/chunk_27_29.blc new file mode 100644 index 0000000..ef8762a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_30.blc b/blight-map/src/main/map/chunks/chunk_27_30.blc new file mode 100644 index 0000000..7966b0e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_27_31.blc b/blight-map/src/main/map/chunks/chunk_27_31.blc new file mode 100644 index 0000000..688d3c2 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_27_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_00.blc b/blight-map/src/main/map/chunks/chunk_28_00.blc new file mode 100644 index 0000000..1748dc5 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_01.blc b/blight-map/src/main/map/chunks/chunk_28_01.blc new file mode 100644 index 0000000..ce9672e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_02.blc b/blight-map/src/main/map/chunks/chunk_28_02.blc new file mode 100644 index 0000000..d32dfff Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_03.blc b/blight-map/src/main/map/chunks/chunk_28_03.blc new file mode 100644 index 0000000..770247a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_04.blc b/blight-map/src/main/map/chunks/chunk_28_04.blc new file mode 100644 index 0000000..6ee7a85 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_05.blc b/blight-map/src/main/map/chunks/chunk_28_05.blc new file mode 100644 index 0000000..e3dc461 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_06.blc b/blight-map/src/main/map/chunks/chunk_28_06.blc new file mode 100644 index 0000000..2bb3cfe Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_07.blc b/blight-map/src/main/map/chunks/chunk_28_07.blc new file mode 100644 index 0000000..80d4734 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_08.blc b/blight-map/src/main/map/chunks/chunk_28_08.blc new file mode 100644 index 0000000..ff6954c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_09.blc b/blight-map/src/main/map/chunks/chunk_28_09.blc new file mode 100644 index 0000000..435d001 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_10.blc b/blight-map/src/main/map/chunks/chunk_28_10.blc new file mode 100644 index 0000000..65aae26 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_11.blc b/blight-map/src/main/map/chunks/chunk_28_11.blc new file mode 100644 index 0000000..632fdec Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_12.blc b/blight-map/src/main/map/chunks/chunk_28_12.blc new file mode 100644 index 0000000..c104b5d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_13.blc b/blight-map/src/main/map/chunks/chunk_28_13.blc new file mode 100644 index 0000000..703d0c7 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_14.blc b/blight-map/src/main/map/chunks/chunk_28_14.blc new file mode 100644 index 0000000..2ac6f41 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_15.blc b/blight-map/src/main/map/chunks/chunk_28_15.blc new file mode 100644 index 0000000..5643dc4 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_16.blc b/blight-map/src/main/map/chunks/chunk_28_16.blc new file mode 100644 index 0000000..ef1413c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_17.blc b/blight-map/src/main/map/chunks/chunk_28_17.blc new file mode 100644 index 0000000..81964ec Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_18.blc b/blight-map/src/main/map/chunks/chunk_28_18.blc new file mode 100644 index 0000000..ddaa5a4 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_19.blc b/blight-map/src/main/map/chunks/chunk_28_19.blc new file mode 100644 index 0000000..6b6e8c0 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_20.blc b/blight-map/src/main/map/chunks/chunk_28_20.blc new file mode 100644 index 0000000..fde6768 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_21.blc b/blight-map/src/main/map/chunks/chunk_28_21.blc new file mode 100644 index 0000000..b83749a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_22.blc b/blight-map/src/main/map/chunks/chunk_28_22.blc new file mode 100644 index 0000000..79fe37e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_23.blc b/blight-map/src/main/map/chunks/chunk_28_23.blc new file mode 100644 index 0000000..70f8ba9 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_24.blc b/blight-map/src/main/map/chunks/chunk_28_24.blc new file mode 100644 index 0000000..0483e44 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_25.blc b/blight-map/src/main/map/chunks/chunk_28_25.blc new file mode 100644 index 0000000..9dc7019 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_26.blc b/blight-map/src/main/map/chunks/chunk_28_26.blc new file mode 100644 index 0000000..21f384e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_27.blc b/blight-map/src/main/map/chunks/chunk_28_27.blc new file mode 100644 index 0000000..8ab31ba Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_28.blc b/blight-map/src/main/map/chunks/chunk_28_28.blc new file mode 100644 index 0000000..be898c6 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_29.blc b/blight-map/src/main/map/chunks/chunk_28_29.blc new file mode 100644 index 0000000..ed9a8d7 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_30.blc b/blight-map/src/main/map/chunks/chunk_28_30.blc new file mode 100644 index 0000000..c4350b8 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_28_31.blc b/blight-map/src/main/map/chunks/chunk_28_31.blc new file mode 100644 index 0000000..d94b4fb Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_28_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_00.blc b/blight-map/src/main/map/chunks/chunk_29_00.blc new file mode 100644 index 0000000..f3e6049 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_01.blc b/blight-map/src/main/map/chunks/chunk_29_01.blc new file mode 100644 index 0000000..bb88b1b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_02.blc b/blight-map/src/main/map/chunks/chunk_29_02.blc new file mode 100644 index 0000000..9f4dc9f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_03.blc b/blight-map/src/main/map/chunks/chunk_29_03.blc new file mode 100644 index 0000000..718c89f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_04.blc b/blight-map/src/main/map/chunks/chunk_29_04.blc new file mode 100644 index 0000000..11600b3 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_05.blc b/blight-map/src/main/map/chunks/chunk_29_05.blc new file mode 100644 index 0000000..c674ba2 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_06.blc b/blight-map/src/main/map/chunks/chunk_29_06.blc new file mode 100644 index 0000000..ffcc4db Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_07.blc b/blight-map/src/main/map/chunks/chunk_29_07.blc new file mode 100644 index 0000000..84a9013 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_08.blc b/blight-map/src/main/map/chunks/chunk_29_08.blc new file mode 100644 index 0000000..1df3166 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_09.blc b/blight-map/src/main/map/chunks/chunk_29_09.blc new file mode 100644 index 0000000..45a8ea1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_10.blc b/blight-map/src/main/map/chunks/chunk_29_10.blc new file mode 100644 index 0000000..c4dc3e7 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_11.blc b/blight-map/src/main/map/chunks/chunk_29_11.blc new file mode 100644 index 0000000..1557ce7 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_12.blc b/blight-map/src/main/map/chunks/chunk_29_12.blc new file mode 100644 index 0000000..13a9764 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_13.blc b/blight-map/src/main/map/chunks/chunk_29_13.blc new file mode 100644 index 0000000..977973f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_14.blc b/blight-map/src/main/map/chunks/chunk_29_14.blc new file mode 100644 index 0000000..1cbc0db Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_15.blc b/blight-map/src/main/map/chunks/chunk_29_15.blc new file mode 100644 index 0000000..95d310c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_16.blc b/blight-map/src/main/map/chunks/chunk_29_16.blc new file mode 100644 index 0000000..d544fdd Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_17.blc b/blight-map/src/main/map/chunks/chunk_29_17.blc new file mode 100644 index 0000000..74f2931 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_18.blc b/blight-map/src/main/map/chunks/chunk_29_18.blc new file mode 100644 index 0000000..40e83a5 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_19.blc b/blight-map/src/main/map/chunks/chunk_29_19.blc new file mode 100644 index 0000000..201347b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_20.blc b/blight-map/src/main/map/chunks/chunk_29_20.blc new file mode 100644 index 0000000..ff5dfda Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_21.blc b/blight-map/src/main/map/chunks/chunk_29_21.blc new file mode 100644 index 0000000..1a5a827 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_22.blc b/blight-map/src/main/map/chunks/chunk_29_22.blc new file mode 100644 index 0000000..ee335b3 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_23.blc b/blight-map/src/main/map/chunks/chunk_29_23.blc new file mode 100644 index 0000000..c78b531 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_24.blc b/blight-map/src/main/map/chunks/chunk_29_24.blc new file mode 100644 index 0000000..4f0b19a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_25.blc b/blight-map/src/main/map/chunks/chunk_29_25.blc new file mode 100644 index 0000000..36563ad Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_26.blc b/blight-map/src/main/map/chunks/chunk_29_26.blc new file mode 100644 index 0000000..d4521ad Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_27.blc b/blight-map/src/main/map/chunks/chunk_29_27.blc new file mode 100644 index 0000000..f38ee3f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_28.blc b/blight-map/src/main/map/chunks/chunk_29_28.blc new file mode 100644 index 0000000..55e7f91 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_29.blc b/blight-map/src/main/map/chunks/chunk_29_29.blc new file mode 100644 index 0000000..92fec3f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_30.blc b/blight-map/src/main/map/chunks/chunk_29_30.blc new file mode 100644 index 0000000..edcf9f7 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_29_31.blc b/blight-map/src/main/map/chunks/chunk_29_31.blc new file mode 100644 index 0000000..27ced4b Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_29_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_00.blc b/blight-map/src/main/map/chunks/chunk_30_00.blc new file mode 100644 index 0000000..3cb39f4 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_01.blc b/blight-map/src/main/map/chunks/chunk_30_01.blc new file mode 100644 index 0000000..9a22f5a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_02.blc b/blight-map/src/main/map/chunks/chunk_30_02.blc new file mode 100644 index 0000000..f73ee0f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_03.blc b/blight-map/src/main/map/chunks/chunk_30_03.blc new file mode 100644 index 0000000..a25c329 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_04.blc b/blight-map/src/main/map/chunks/chunk_30_04.blc new file mode 100644 index 0000000..325c158 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_05.blc b/blight-map/src/main/map/chunks/chunk_30_05.blc new file mode 100644 index 0000000..724db36 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_06.blc b/blight-map/src/main/map/chunks/chunk_30_06.blc new file mode 100644 index 0000000..f74673e Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_07.blc b/blight-map/src/main/map/chunks/chunk_30_07.blc new file mode 100644 index 0000000..2437ed5 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_08.blc b/blight-map/src/main/map/chunks/chunk_30_08.blc new file mode 100644 index 0000000..c647f04 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_09.blc b/blight-map/src/main/map/chunks/chunk_30_09.blc new file mode 100644 index 0000000..34ba4dc Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_10.blc b/blight-map/src/main/map/chunks/chunk_30_10.blc new file mode 100644 index 0000000..a00a49c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_11.blc b/blight-map/src/main/map/chunks/chunk_30_11.blc new file mode 100644 index 0000000..84b3e26 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_12.blc b/blight-map/src/main/map/chunks/chunk_30_12.blc new file mode 100644 index 0000000..051d0b2 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_13.blc b/blight-map/src/main/map/chunks/chunk_30_13.blc new file mode 100644 index 0000000..a0e5147 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_14.blc b/blight-map/src/main/map/chunks/chunk_30_14.blc new file mode 100644 index 0000000..e14c27d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_15.blc b/blight-map/src/main/map/chunks/chunk_30_15.blc new file mode 100644 index 0000000..5ab00e7 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_16.blc b/blight-map/src/main/map/chunks/chunk_30_16.blc new file mode 100644 index 0000000..2c387eb Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_17.blc b/blight-map/src/main/map/chunks/chunk_30_17.blc new file mode 100644 index 0000000..cc6eeb2 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_18.blc b/blight-map/src/main/map/chunks/chunk_30_18.blc new file mode 100644 index 0000000..50573cc Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_19.blc b/blight-map/src/main/map/chunks/chunk_30_19.blc new file mode 100644 index 0000000..4a95f11 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_20.blc b/blight-map/src/main/map/chunks/chunk_30_20.blc new file mode 100644 index 0000000..6769d20 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_21.blc b/blight-map/src/main/map/chunks/chunk_30_21.blc new file mode 100644 index 0000000..8b135f5 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_22.blc b/blight-map/src/main/map/chunks/chunk_30_22.blc new file mode 100644 index 0000000..b5970df Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_23.blc b/blight-map/src/main/map/chunks/chunk_30_23.blc new file mode 100644 index 0000000..861de93 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_24.blc b/blight-map/src/main/map/chunks/chunk_30_24.blc new file mode 100644 index 0000000..705f5d3 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_25.blc b/blight-map/src/main/map/chunks/chunk_30_25.blc new file mode 100644 index 0000000..7b226a4 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_26.blc b/blight-map/src/main/map/chunks/chunk_30_26.blc new file mode 100644 index 0000000..126abd8 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_27.blc b/blight-map/src/main/map/chunks/chunk_30_27.blc new file mode 100644 index 0000000..5d7faa1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_28.blc b/blight-map/src/main/map/chunks/chunk_30_28.blc new file mode 100644 index 0000000..f04c170 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_29.blc b/blight-map/src/main/map/chunks/chunk_30_29.blc new file mode 100644 index 0000000..8c4bad9 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_30.blc b/blight-map/src/main/map/chunks/chunk_30_30.blc new file mode 100644 index 0000000..bca3194 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_30_31.blc b/blight-map/src/main/map/chunks/chunk_30_31.blc new file mode 100644 index 0000000..5253994 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_30_31.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_00.blc b/blight-map/src/main/map/chunks/chunk_31_00.blc new file mode 100644 index 0000000..ff13c8c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_00.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_01.blc b/blight-map/src/main/map/chunks/chunk_31_01.blc new file mode 100644 index 0000000..55dc845 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_01.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_02.blc b/blight-map/src/main/map/chunks/chunk_31_02.blc new file mode 100644 index 0000000..7f196cb Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_02.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_03.blc b/blight-map/src/main/map/chunks/chunk_31_03.blc new file mode 100644 index 0000000..dabb40c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_03.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_04.blc b/blight-map/src/main/map/chunks/chunk_31_04.blc new file mode 100644 index 0000000..e40f6ba Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_04.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_05.blc b/blight-map/src/main/map/chunks/chunk_31_05.blc new file mode 100644 index 0000000..776df94 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_05.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_06.blc b/blight-map/src/main/map/chunks/chunk_31_06.blc new file mode 100644 index 0000000..8e77452 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_06.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_07.blc b/blight-map/src/main/map/chunks/chunk_31_07.blc new file mode 100644 index 0000000..135677f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_07.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_08.blc b/blight-map/src/main/map/chunks/chunk_31_08.blc new file mode 100644 index 0000000..bc8d82a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_08.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_09.blc b/blight-map/src/main/map/chunks/chunk_31_09.blc new file mode 100644 index 0000000..01da387 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_09.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_10.blc b/blight-map/src/main/map/chunks/chunk_31_10.blc new file mode 100644 index 0000000..5c6ca39 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_10.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_11.blc b/blight-map/src/main/map/chunks/chunk_31_11.blc new file mode 100644 index 0000000..68ca8bc Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_11.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_12.blc b/blight-map/src/main/map/chunks/chunk_31_12.blc new file mode 100644 index 0000000..ad767c1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_12.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_13.blc b/blight-map/src/main/map/chunks/chunk_31_13.blc new file mode 100644 index 0000000..70deea5 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_13.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_14.blc b/blight-map/src/main/map/chunks/chunk_31_14.blc new file mode 100644 index 0000000..df40df2 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_14.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_15.blc b/blight-map/src/main/map/chunks/chunk_31_15.blc new file mode 100644 index 0000000..dbca424 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_15.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_16.blc b/blight-map/src/main/map/chunks/chunk_31_16.blc new file mode 100644 index 0000000..54c6228 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_16.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_17.blc b/blight-map/src/main/map/chunks/chunk_31_17.blc new file mode 100644 index 0000000..34d641d Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_17.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_18.blc b/blight-map/src/main/map/chunks/chunk_31_18.blc new file mode 100644 index 0000000..548638c Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_18.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_19.blc b/blight-map/src/main/map/chunks/chunk_31_19.blc new file mode 100644 index 0000000..0be143f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_19.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_20.blc b/blight-map/src/main/map/chunks/chunk_31_20.blc new file mode 100644 index 0000000..a08a295 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_20.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_21.blc b/blight-map/src/main/map/chunks/chunk_31_21.blc new file mode 100644 index 0000000..508050f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_21.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_22.blc b/blight-map/src/main/map/chunks/chunk_31_22.blc new file mode 100644 index 0000000..273b9cf Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_22.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_23.blc b/blight-map/src/main/map/chunks/chunk_31_23.blc new file mode 100644 index 0000000..8c43a19 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_23.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_24.blc b/blight-map/src/main/map/chunks/chunk_31_24.blc new file mode 100644 index 0000000..6530b75 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_24.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_25.blc b/blight-map/src/main/map/chunks/chunk_31_25.blc new file mode 100644 index 0000000..9cb7ad2 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_25.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_26.blc b/blight-map/src/main/map/chunks/chunk_31_26.blc new file mode 100644 index 0000000..0501a01 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_26.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_27.blc b/blight-map/src/main/map/chunks/chunk_31_27.blc new file mode 100644 index 0000000..e9d610f Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_27.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_28.blc b/blight-map/src/main/map/chunks/chunk_31_28.blc new file mode 100644 index 0000000..ee38923 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_28.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_29.blc b/blight-map/src/main/map/chunks/chunk_31_29.blc new file mode 100644 index 0000000..321b20a Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_29.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_30.blc b/blight-map/src/main/map/chunks/chunk_31_30.blc new file mode 100644 index 0000000..27188d1 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_30.blc differ diff --git a/blight-map/src/main/map/chunks/chunk_31_31.blc b/blight-map/src/main/map/chunks/chunk_31_31.blc new file mode 100644 index 0000000..2e07928 Binary files /dev/null and b/blight-map/src/main/map/chunks/chunk_31_31.blc differ diff --git a/doc/.~lock.Heilung, Ausdauer, Mana.odt# b/doc/.~lock.Heilung, Ausdauer, Mana.odt# new file mode 100644 index 0000000..ea75902 --- /dev/null +++ b/doc/.~lock.Heilung, Ausdauer, Mana.odt# @@ -0,0 +1 @@ +,mario,mario-mint,08.06.2026 22:14,file:///home/mario/.config/libreoffice/4; \ No newline at end of file diff --git a/doc/Heilung, Ausdauer, Mana.odt b/doc/Heilung, Ausdauer, Mana.odt new file mode 100644 index 0000000..7b84887 Binary files /dev/null and b/doc/Heilung, Ausdauer, Mana.odt differ diff --git a/ez-tree-jme/src/main/java/de/blight/eztree/Tree.java b/ez-tree-jme/src/main/java/de/blight/eztree/Tree.java index 6aa85a0..fd61771 100644 --- a/ez-tree-jme/src/main/java/de/blight/eztree/Tree.java +++ b/ez-tree-jme/src/main/java/de/blight/eztree/Tree.java @@ -44,6 +44,12 @@ public class Tree extends Node { private final List leafIdx = new ArrayList<>(); private final List leafWind = new ArrayList<>(); + /** No-arg constructor required by JME3 BinaryImporter. */ + public Tree() { + super("EzTree"); + this.opts = new TreeOptions(); + } + public Tree(TreeOptions opts) { super("EzTree"); this.opts = opts;