- docs/mapmaking/00-index.md — SDK overview with workflow diagram - docs/mapmaking/01-getting-started.md — template setup & first map - docs/mapmaking/02-building-geometry.md — CSG guide & prefab reference - docs/mapmaking/03-lighting-and-env.md — LightmapGI baking guide - docs/mapmaking/04-validation.md — validator CLI & CI/CD usage - docs/mapmaking/05-packaging-and-shipping.md — .pck pipeline - docs/mapmaking/06-faq-and-troubleshooting.md — 30+ common issues - README.md — add mapmaking SDK link to features list
9.0 KiB
FAQ & Troubleshooting
Common questions, issues, and solutions encountered while building maps.
Template Project
Q: Can I use the template project without the main game repo?
Yes. The template project at client/map_template/ is a standalone Godot
project. Copy it anywhere, open it in Godot, and start building. You only
need the main repo for packaging (pack_map.gd) and the registry server
(map_registry_server.py).
Q: Why does Godot say "Import" instead of "Open"?
The template has its own project.godot, making it a separate project. Use
Import to add it to your Godot project list. You're not opening a scene
within an existing project.
Q: How do I add the main game's assets to my map?
The template uses placeholder materials. For final maps:
- Copy your map's
.tscninto the main project underclient/maps/<name>/ - Open it from the main project's scenes tab
- The main game's modular kit and PBR materials will be available
- Assign materials to your CSG/MeshInstance3D nodes from the main project's asset library
Q: Can I use external models from Blender/Maya?
Yes. Export as .glb or .obj and import into Godot. Keep triangle counts
within budget (≤ 50K total, ≤ 5K per mesh recommended). Place imported meshes
as children of the map scene root.
Geometry & CSG
Q: My map has light leaks at the corners
Thin gaps between CSG blocks let light bleed through. Fix by overlapping CSG edges by 0.1 units instead of butting them flush.
Bad: Wall ends at x=10.0, floor ends at x=10.0 → gap
Good: Wall extends to x=10.1, floor ends at x=10.0 → overlap
Q: Players can walk through walls
Make sure use_collision = true is set on all CSG geometry nodes. CSG nodes
don't have collision by default — you must enable it.
Q: My map renders as a grey box / no materials
Placeholder materials are normal during construction. For the final look, you need to:
- Copy the map to the main project (see above)
- Assign materials from the game's asset library
- Re-bake LightmapGI after materials are assigned
Q: CSG performance is bad in the editor
This is normal. CSG is re-calculated every time you move a node. For testing, convert stable geometry to MeshInstance3D:
- Right-click CSG parent → Convert CSG to Mesh
- Keep a backup copy of the CSG hierarchy in another scene
Q: How do I make a skybox?
Add a WorldEnvironment node and assign an Environment resource:
- Set Background mode to Sky
- Create a new Sky resource
- Assign a PanoramaSky or ProceduralSky material
- The sky appears behind your geometry
Q: My map has no collision after CSG → Mesh conversion
When you convert CSG to MeshInstance3D, collision is not preserved. Add a
CollisionShape3D as a child of each MeshInstance3D, or use Godot's
Mesh → Create Trimesh Collision (right-click the MeshInstance3D).
Lighting
Q: My lightmap bake takes forever
Baking time depends on:
- texel_scale — lower = higher resolution = longer bake (try 2.0 for testing)
- bounces — fewer bounces = faster bake (use 1 for quick tests, 3 for final)
- Map size — larger maps bake longer
- Light count — more lights = more calculations
For quick iteration, use Low quality (0) during development and High quality (2) for the final bake.
Q: Baked lighting is too dark
- Increase
bouncesto 3 (more light bounce = brighter interiors) - Add a low-intensity ambient fill (OmniLight3D with Static bake mode)
- Lower the
texel_scalefor more lightmap resolution - Check that the DirectionalLight3D intensity is sufficient
Q: Lightmap has visible seams
Seams appear where lightmap texels don't align. Fixes:
- Lower
texel_scaleto 1.0 (higher resolution lightmaps) - Ensure CSG edges overlap (no gaps)
- Convert CSG to MeshInstance3D before final bake
Q: Shadows look blocky or jagged
This is Godot's shadow mapping at default resolution. For competitive clarity:
- Keep
shadow_biasat 0.1 (higher = softer shadows, fewer artefacts) - Directional shadow
max_distanceat 20–30 (shadows beyond this use lower resolution)
Q: I see a sphere artifact on my ReflectionProbe
The ReflectionProbe has a probe_mode property — if set to Reflection Probe
(sphere mode), it renders as a visible sphere in reflections. Change to Box
Probe for interior spaces, or disable reflection visibility via the visible
property on the probe's MeshInstance3D child (Godot 4.x).
Q: Can I have a day/night cycle?
No. LightmapGI bakes lighting statically. Dynamic lighting is limited to ≤ 4 real-time lights. Day/night cycles are outside the current scope.
Validation
Q: The validator says "No MeshInstance3D nodes found"
Your map is using CSG nodes that haven't been converted to meshes. The validator counts mesh triangles — CSG nodes are scanned as MeshInstance3D after conversion. Either:
- Convert CSG → Mesh for the area you want validated (right-click → Convert CSG to Mesh)
- This warning is expected during early construction stages
Q: The validator fails with "Scene cannot be instantiated"
The scene depends on resources that don't exist in the template project. This usually happens when the map references game assets from the main project. Either:
- Run the validator from the main game project (
--path clientwith the mainclient/project.godot), or - Strip external dependencies — the map should be self-contained
Q: The validator reports texture errors but my textures are 1024×1024
Check for textures with different aspect ratios. A 2048×512 texture fails because the larger dimension (2048) exceeds 1024. Resize or tile.
Q: Can I skip certain validator checks?
Not directly. Run the validator, fix errors, then fix warnings. If a check
produces a false positive, the @tool scripts are in
client/tools/validate_map/ — you can edit the constants (e.g.
MAX_TOTAL_TRIANGLES) for custom pipelines.
Packaging
Q: The .pck file is very large
The .pck includes all dependencies of the scene. Large files mean:
- High-resolution textures (use ≤ 1024×1024 per the budget)
- High-poly meshes (stay under 50K triangles)
- Embedded audio or other large assets
Run the validator first to check budgets.
Q: I get "Failed to load pack" in-game
Possible causes:
.pckfile is corrupted (check SHA-256 checksum)- The map scene or a dependency path changed between packaging and loading
- The
.pckwas built with a different Godot version than the game - The resource path in the
.pckconflicts with a path in the base game
Solution: Re-package the map from the same Godot version the game uses.
Verify with curl that the download matches the server's checksum.
Q: Can I update a map without changing the client version?
Yes. The .pck is additive content. Update the .pck on the registry server
and increment the version field in the .json metadata. The client will
re-download when it notices the version mismatch.
Q: Can I host the registry server on a different port?
Yes. Use --port <port> or the MAP_REGISTRY_PORT environment variable.
The client's MapDownloader has a registry_url property you can set.
Q: Can I load more than one .pck at a time?
Yes. ProjectSettings.load_resource_pack() is additive. Multiple .pck files
can be loaded simultaneously — each adds its resources to the global namespace.
Q: The registry server returns 404 for my map
- Check that the
.pckfile is in the maps directory (default./packed_maps/) - Check the file extension is
.pck(lowercase) - The server auto-scans every 5 seconds — wait or send SIGHUP to force a scan
- Verify by listing:
curl http://localhost:8090/maps
General
Q: Can I make a hostage rescue map?
The SDK is gameplay-agnostic. The groups ct_spawn, t_spawn, bomb_site,
and buy_zone are the default set. You can add your own groups (e.g.,
hostage, hostage_zone) — the game logic discovers them at runtime.
Check the game's plugin API documentation for custom group support.
Q: Can I use this SDK for a different game?
The SDK is designed for Tactical Shooter's Godot project structure. The packaging and validation scripts are reusable for any Godot map-authoring workflow, but the group conventions and gameplay nodes are game-specific.
Q: The editor validator doesn't run
The template_map.gd script uses @tool and checks Engine.is_editor_hint().
Make sure:
- The script is attached to the root node of the scene
- You're editing the scene in the Godot editor (not running the game)
- The Output panel is visible (Window → Output)
Q: How do I report a bug in the SDK?
Open an issue on the project's Gitea repository. Include:
- SDK version (commit hash)
- Godot version
- Steps to reproduce
- Log output (editor or CLI validator)
Q: Can I contribute validator modules?
Yes. See Validation — Adding a Custom Validator Module. Submit a pull request with your module and updated documentation.