Files
tactical-shooter/client/map_template/README.md
T
shawn e7299b17e9 Phase 7: netfox + godot-jolt stack upgrade
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)
2026-07-02 17:39:22 -04:00

182 lines
6.8 KiB
Markdown

# Tactical Shooter — Map Template
A standalone Godot 4 project for building custom competitive maps.
## Quick Start
1. **Copy this directory**`cp -r map_template/ maps/my_custom_map/`
2. **Rename `template_map.tscn`** — e.g. `de_dust2.tscn`
3. **Open the new directory in Godot 4** — add the map template project
4. **Build geometry** — use CSG brushes or instance modular kit pieces
5. **Place gameplay prefabs** — spawn points, bomb sites, buy zones
6. **Bake lighting** — select LightmapGI → "Bake Lightmap"
7. **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 site
- `ct_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 blocks
- `CSGCombiner3D` — 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:
1. **Copy your .tscn + assets** into the main project at `client/maps/<map_name>/`
2. **Pack as .pck:** `cd client && godot --headless --pack --export-pack maps/<map_name>.pck res://maps/<map_name>.tscn`
3. **Register with master server** via POST `/api/v1/maps/register`
4. **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.