e7299b17e9
Stack installed: - netfox v1.35.3 (core + extras + noray + internals) - godot-jolt v0.16.0-stable Architecture: - Server: ENet transport (works headless, no netfox deps) - Client/Editor: netfox rollback (RollbackSynchronizer, TickInterpolator) New/modified: - docs/migration-netfox-plan.md — migration architecture - scripts/network/network_manager.gd — netfox-aware ENet fallback - scripts/network/player.gd — clean base player - client/characters/player_netfox.gd — rollback player w/ WeaponManager - client/characters/input/player_net_input.gd — BaseNetInput subclass - client/characters/character/fps_character_controller.gd — netfox input feed - client/weapons/ — weapon data, registry, TacticalWeaponHitscan, WeaponManager - client/scripts/round_replicator.gd — client-side round state bridge - server/scripts/round_manager.gd — improved state machine - server/scripts/plugin_api/plugin_manager.gd — refined plugin system - config: enemy_tag, ally_tag for meatball targeting Removed: old C++ SimulationServer GDExtension (replaced by netfox rollback)
6.8 KiB
6.8 KiB
Tactical Shooter — Map Template
A standalone Godot 4 project for building custom competitive maps.
Quick Start
- Copy this directory —
cp -r map_template/ maps/my_custom_map/ - Rename
template_map.tscn— e.g.de_dust2.tscn - Open the new directory in Godot 4 — add the map template project
- Build geometry — use CSG brushes or instance modular kit pieces
- Place gameplay prefabs — spawn points, bomb sites, buy zones
- Bake lighting — select LightmapGI → "Bake Lightmap"
- Package & ship — use the PCK pipeline to publish
Directory Structure
map_template/
├── project.godot # Standalone Godot project config
├── template_map.tscn # Demo map scene (copy & rename)
├── template_map.gd # Editor tool script (auto-validates map)
└── assets/
└── prefabs/
├── ct_spawn.tscn # Counter-Terrorist spawn point
├── t_spawn.tscn # Terrorist spawn point
├── buy_zone.tscn # Purchase zone area
├── bomb_site.tscn # Bomb plant site area
├── cubemap_origin.tscn # Reflection probe origin
└── map_bounds.tscn # Out-of-bounds kill wall
Prefab Reference
Node Type Conventions
All gameplay nodes are discovered by Godot groups, not by node name. Add nodes to these groups for game logic to find them:
| Group | Node Type | Purpose |
|---|---|---|
ct_spawn |
Marker3D | CT team spawn position |
t_spawn |
Marker3D | Terrorist team spawn position |
buy_zone |
Area3D | Purchase-eligible zone |
bomb_site |
Area3D | Bomb plant zone |
cubemap_origin |
Node3D | Reflection cubemap capture point |
map_bounds |
Area3D | Out-of-bounds kill wall |
Additional groups (informational, set by map author):
bombsite_a/bombsite_b— sub-identify which bomb sitect_buy/t_buy— team-specific buy zones (if separated)
ct_spawn.tscn
- Type: Marker3D (green pad with +Z direction arrow)
- Group:
ct_spawn - Usage: Place on floor, one per player slot (usually 5). The +Z arrow indicates the direction players face on spawn. Add child Node3Ds for additional spawn positions.
- Customisation: Duplicate instances rather than editing the prefab. Adjust position and rotation only — the pad is cosmetic.
t_spawn.tscn
- Type: Marker3D (red pad with +Z direction arrow)
- Group:
t_spawn - Same usage as ct_spawn but for the Terrorist team.
buy_zone.tscn
- Type: Area3D with CollisionShape3D
- Group:
buy_zone - Usage: Place to define an area where players can purchase items. Resize the child CollisionShape3D to match the room. The Area3D monitors body_entered/body_exited to activate/deactivate the buy menu.
- Visual: Semi-transparent yellow box as editor reference.
bomb_site.tscn
- Type: Area3D with CollisionShape3D
- Group:
bomb_site - Usage: Place to define where the bomb can be planted. Resize the CollisionShape3D to cover the site. Rename the instance "BombsiteA" or "BombsiteB" and add the sub-group (bombsite_a / bombsite_b).
- Visual: Semi-transparent orange floor panel + CSG subtraction hint for plantable ground area.
cubemap_origin.tscn
- Type: Node3D with small blue marker
- Group:
cubemap_origin - Usage: Mark the ideal position for the ReflectionProbe cubemap capture. Place at eye height (1.6 units above floor) in the most visually prominent part of the map.
- Note: The ReflectionProbe itself is a separate node — place it at this marker's position after geometry is finalised.
map_bounds.tscn
- Type: Area3D with CollisionShape3D
- Group:
map_bounds - Usage: Invisible kill wall. Place one per perimeter side, resize to form a closed box around the playable area. Detects body_exited to teleport/kill out-of-bounds players.
- Visual: Semi-transparent red wall as editor reference.
Building a Map — Checklist
Essential
- Floor geometry (CSGBox3D or modular kit tiles)
- Wall geometry enclosing the playable area
- Ceiling or skybox boundary
- Collision on all CSG brushes (
use_collision = true)
Gameplay
- CT spawn points for each player (group
ct_spawn) - T spawn points for each player (group
t_spawn) - Two bomb sites, each with group
bomb_site - Buy zones at each spawn area (group
buy_zone) - Map bounds perimeter walls (group
map_bounds)
Lighting
- WorldEnvironment with sky/ambient
- DirectionalLight3D (sun) with shadows enabled
- Fill/ambient OmniLight3D(s)
- ReflectionProbe at cubemap origin
- LightmapGI configured with quality=2, bounces=3
- Lightmap baked (select LightmapGI → "Bake Lightmap")
Validation
- Open template_map.tscn in Godot editor — the tool script auto-runs
- Check Output panel (bottom dock) for validation results
- All checks pass (green ✓)
- For headless validation, use the main project's validator from
client/:godot --script scripts/validate_scene.gd -- --scene=res://maps/my_map.tscn
CSG Building Guide
Godot's CSG (Constructive Solid Geometry) nodes let you build map geometry directly in the editor. Key shortcuts:
- W — Move tool
- E — Rotate tool
- R — Scale tool
- Ctrl+D — Duplicate selected node
- Ctrl+Shift+C — Bake LightmapGI
CSG node types used in this template:
CSGBox3D— Basic wall/floor/ceiling blocksCSGCombiner3D— Grouped geometry (container, non-collidable parent)CSGSphere3D/CSGCylinder3D— Curved shapes
CSG operations:
| Operation | Effect |
|---|---|
| Union (0) | Adds to existing CSG (default) |
| Subtraction (1) | Cuts hole through parent CSG |
| Intersection (2) | Keeps only overlapping volume |
Performance rule: Use as few CSG nodes as possible. For detailed maps, bake CSG to a MeshInstance3D via Scene → "Convert CSG to Mesh" when geometry is finalised.
Integrating with the Main Project
When your map is complete:
- Copy your .tscn + assets into the main project at
client/maps/<map_name>/ - Pack as .pck:
cd client && godot --headless --pack --export-pack maps/<map_name>.pck res://maps/<map_name>.tscn - Register with master server via POST
/api/v1/maps/register - Test in-game: connect to server and
changelevel <map_name>
Limitations
- Standalone preview: Direct CSG rendering in this template uses basic placeholder materials. Final maps should use the main project's modular kit assets and PBR materials.
- Lightmap baking: Godot 4.7 LightmapGI baking is editor-only. Open this project in the editor to bake.
- Non-Euclidean geometry: Not supported by CSG. Use MeshInstance3D for complex shapes.