- Fix dead code in server_main.gd (unreachable lag compensation print)
- Remove WeaponData type hints from weapon_server.gd (Resource class_name in Node scripts = headless fail)
- Use preload() instead of WeaponData class_name in weapon_definitions.gd for const refs
- Lazy-init WEAPONS dict (const can't reference preload members)
- Remove duplicate class_name RoundManager from server/scripts/round/round_manager.gd
- Remove DamageProcessor type hints from round/round_manager.gd and bomb_objective.gd
- Add start()/stop()/can_tick()/tick()/spawn_entity()/despawn_entity() to simulation_server_stub.gd
- Fix get_world_3d() → get_tree().root.world_3d in weapon_server.gd Node context
- Fix var data := → var data = for untyped WeaponDefinitions.get_weapon() returns
- Clean export cache and verify server starts with zero parse errors
- Replaced TeamData.Team type hints with int in all scripts
- Added explicit preloads for headless mode class resolution
- Created stub LagCompensation and DamageProcessor scripts
- Fixed PluginManager, SpawnManager, EconomyManager, BuyZone,
RoundManager, BuyMenuHandler, BombObjective class_name references
- Updated server config to match ServerConfig.gd format
Gray screen root cause: server scripts failed to parse in headless
mode due to Godot 4 class_name loading order (Resource after Node),
leaving server_main.gd non-functional — accepted connections but
never spawned players.
Adds:
- bomb_objective.gd: server-authoritative bomb state machine (IDLE→PLANTED→EXPLODED/DEFUSED)
- plant_bomb(player_id, pos) - T-side only, LIVE phase, inside bombsite
- defuse_bomb(player_id) - CT-side only, near bomb, 5s timer
- cancel_defuse(player_id) - if defuser moves or is killed
- bomb_explode() - configurable radius damage (10m lethal, 15m half)
- 40s bomb timer (configurable)
- Full query API: is_bomb_planted(), get_bomb_position(), get_bomb_timer()
- Signals: bomb_planted, bomb_defused, bomb_exploded, defuse_started, defuse_cancelled
- Connected to RoundManager via GameServer for round-end outcomes
- bomb_carrier.gd: client-side bomb carrier UI
- Bomb status/defuse progress UI updates
- Direction indicator to planted bomb
- "Hold E to defuse" prompt for CT near bomb
- "Hold E to plant" prompt for T with bomb in bombsite
- test_range.tscn: BombsiteA (south-west, -20,0,-5) and BombsiteB (north-east, 15,0,20)
- 8x4m Area3D zones with BoxShape3D collision
- PlantPosition Marker3D children
- Group 'bomb_sites' for server discovery
- game_server.gd: BombObjective integration in _ready()
- Creates and wires BombObjective to RoundManager, TeamManager, DamageProcessor
- Registers bomb sites from scene tree
- Connects bomb_exploded/bomb_defused → RoundManager.end_round()
- Connects round_ended → bomb.reset()