Camera seat LIVE + Mech::PlayerLinkMessageHandler reconstructed (@0049f624)
The spectator/broadcast seat works end-to-end: a hostType=1 +
vehicle=camera pilot page boots a CameraShip whose 62-camera arena1
network loads from the BTL4.RES type-27 resource (the engine's
CreateStreamedCameraInstances existed all along -- the file probe falls
back to it), the BTCameraDirector locks onto the first live mech, and
the ship TRACKS it (sees=1, goal advancing) and CUTS between authored
camera positions (screenshot-verified: wide arena shot -> close
tracking shot).
The missing piece was the Mech override of PlayerLinkMessageHandler
(@0049f624), which the reconstruction never filled. The engine base
resolves mech->player; BT's override adds:
1. the REVERSE link player->playerVehicle = this on EVERY node
(replicants included) -- how the camera director and scoreboard
find a REMOTE player's mech; without it a spectator parks forever
('NO goal entity')
2. clears NonScoringPlayerFlag (0x4000 = bit 14): a pilot with a
vehicle is a SCORING player -- this admits REPLICATED players to
the ranking pass, so cross-node rank/score displays work
3. master only: seeds the heat bank's ambientTemperature (bank
@0x1d4) from the mission [mission] temperature= (BTMission+0xf4)
-- correcting the heat family's 'frozen 300' deviation note (it
was never frozen; THIS is the writer)
Bridge BTSetBankAmbientTemperature lives in heatfamily_reslice.cpp
(mech.cpp cannot include subsystem headers -- local-stub collision).
BT_CAM_LOG diagnostics: camera-network count, director pick + Players
group census, ship follow state, link dispatch/receive.
Verified live: 2-seat (mech + camera) relay session -- replicated
player shows +veh, director goal locked w/ 30s timer, ship tracking a
moving mech through camera cuts; standard 2-node mech smoke PASS
(un-regressed). Lesson re-learned: a 'clean' build filtered on 'error
C' missed a linker file-lock failure -- one whole test cycle ran
against a stale exe (the /FORCE gotcha's cousin; grep -i error, not
error C).
Remaining (task open): ranking-window overlay draw (L4VIDRND stubs),
operator-app camera-seat row, shot polish.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
74d9d3b6ff
commit
4459262b9c
@@ -247,6 +247,39 @@ void
|
||||
}
|
||||
}
|
||||
|
||||
// BT port diag (BT_CAM_LOG, 1 Hz): why is/isn't the director tracking
|
||||
if (getenv("BT_CAM_LOG"))
|
||||
{
|
||||
static float s_acc = 0.0f; s_acc += time_slice;
|
||||
if (s_acc >= 1.0f)
|
||||
{
|
||||
s_acc = 0.0f;
|
||||
DEBUG_STREAM << "[cam] director pick: player=" << (void*)player
|
||||
<< " vehicle=" << (void*)vehicle
|
||||
<< " goal=" << (void*)GetGoalEntity()
|
||||
<< " timer=" << timeLeftOnPlayer;
|
||||
// who IS in the Players group here?
|
||||
EntityGroup *pg =
|
||||
application->GetEntityManager()->FindGroup("Players");
|
||||
if (pg)
|
||||
{
|
||||
DEBUG_STREAM << " group:[";
|
||||
Player *p;
|
||||
ChainIteratorOf<Node*> it(pg->groupMembers);
|
||||
while ((p = (Player *)it.ReadAndNext()) != NULL)
|
||||
{
|
||||
DEBUG_STREAM << " bmp=" << p->playerBitmapIndex
|
||||
<< (p->GetPlayerVehicle() ? "+veh" : "-veh");
|
||||
}
|
||||
DEBUG_STREAM << " ]";
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUG_STREAM << " group:MISSING";
|
||||
}
|
||||
DEBUG_STREAM << "\n" << std::flush;
|
||||
}
|
||||
}
|
||||
if (player == 0 || vehicle == 0)
|
||||
{
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user