feat: surface SCUM vehicle functional state
This commit is contained in:
@@ -405,6 +405,10 @@ func (svc *CoreService) ingestSCUMVehicleFact(instance domain.ServerInstance, fa
|
||||
if fact.Locked != nil {
|
||||
vehicle.Locked = *fact.Locked
|
||||
}
|
||||
if fact.Functional != nil {
|
||||
functional := *fact.Functional
|
||||
vehicle.Functional = &functional
|
||||
}
|
||||
if fact.Position != nil {
|
||||
vehicle.X, vehicle.Y, vehicle.Z = floatPtr(fact.Position.X), floatPtr(fact.Position.Y), floatPtr(fact.Position.Z)
|
||||
}
|
||||
|
||||
@@ -535,6 +535,10 @@ func scumVehicleFactsFromRows(rows []scumQueryRow, projection domain.GameClientB
|
||||
DisplayName: scumRowText(row, projection, "displayName"),
|
||||
LockedBySteamID: scumRowText(row, projection, "lockedBySteamId"),
|
||||
}
|
||||
if functional, ok := scumRowBool(row, projection, "functional"); ok {
|
||||
value := functional
|
||||
fact.Functional = &value
|
||||
}
|
||||
if exists, ok := scumRowBool(row, projection, "exists"); ok {
|
||||
value := exists
|
||||
fact.Exists = &value
|
||||
|
||||
@@ -46,7 +46,7 @@ func newSCUMQueryIngestFixture(t *testing.T) (*CoreService, string, domain.Serve
|
||||
PollIntervalSeconds: 120, MaxRows: 500, TimeoutSeconds: 30,
|
||||
Projections: []domain.GameClientBridgeQueryProjectionDeclaration{{
|
||||
Collection: scumProjectionVehicles, RowPath: "rows", UpsertKeys: []string{"gameVehicleId"},
|
||||
FieldMappings: map[string]string{"gameVehicleId": "gameVehicleId", "vehicleClass": "vehicleClass", "displayName": "displayName", "exists": "existsInGame", "x": "x", "y": "y", "z": "z"},
|
||||
FieldMappings: map[string]string{"gameVehicleId": "gameVehicleId", "vehicleClass": "vehicleClass", "displayName": "displayName", "functional": "functional", "exists": "existsInGame", "x": "x", "y": "y", "z": "z"},
|
||||
}},
|
||||
}}},
|
||||
})
|
||||
@@ -178,7 +178,7 @@ func TestSCUMQueryProjectionFillsTypedTables(t *testing.T) {
|
||||
t.Fatalf("project player rows: %v", err)
|
||||
}
|
||||
vehicleJob.State = domain.JobStateSucceeded
|
||||
vehicleJob.ExecutionResult = domain.JobExecutionResult{Kind: "sqlite.query", Content: `{"rows":[{"gameVehicleId":"5923426","vehicleClass":"MountainBike_ES","displayName":"","existsInGame":1,"x":-406400.84375,"y":558707.4375,"z":83294.6171875,"observedAt":"2026-09-16T08:05:00Z"}]}`}
|
||||
vehicleJob.ExecutionResult = domain.JobExecutionResult{Kind: "sqlite.query", Content: `{"rows":[{"gameVehicleId":"5923426","vehicleClass":"MountainBike_ES","displayName":"","functional":1,"existsInGame":1,"x":-406400.84375,"y":558707.4375,"z":83294.6171875,"observedAt":"2026-09-16T08:05:00Z"}]}`}
|
||||
if err := svc.projectRemoteAdapterJobResult(vehicleJob, fixedTime); err != nil {
|
||||
t.Fatalf("project vehicle rows: %v", err)
|
||||
}
|
||||
@@ -198,7 +198,7 @@ func TestSCUMQueryProjectionFillsTypedTables(t *testing.T) {
|
||||
t.Fatalf("expected last login from database evidence, got %s", user.LastLoginAt)
|
||||
}
|
||||
vehicles, err := svc.ListSCUMVehiclesForSession(session, domain.SCUMVehicleFilter{ServerInstanceID: instance.ID})
|
||||
if err != nil || len(vehicles) != 1 || vehicles[0].VehicleClass != "MountainBike_ES" || vehicles[0].X == nil || *vehicles[0].X != -406400.84375 {
|
||||
if err != nil || len(vehicles) != 1 || vehicles[0].VehicleClass != "MountainBike_ES" || vehicles[0].Functional == nil || !*vehicles[0].Functional || vehicles[0].X == nil || *vehicles[0].X != -406400.84375 {
|
||||
t.Fatalf("unexpected projected vehicle: vehicles=%+v err=%v", vehicles, err)
|
||||
}
|
||||
userTracks, err := svc.ListSCUMUserTrajectoriesForSession(session, domain.SCUMUserTrajectoryFilter{ServerInstanceID: instance.ID})
|
||||
|
||||
@@ -15,6 +15,7 @@ func TestSCUMFactIngestMaintainsPlatformTablesAndWelcomeQueue(t *testing.T) {
|
||||
gold := int64(3)
|
||||
exists := true
|
||||
locked := true
|
||||
functional := true
|
||||
observedAt := fixedTime.Add(-1 * time.Minute)
|
||||
|
||||
result, err := svc.IngestSCUMFacts(domain.SCUMFactIngest{
|
||||
@@ -26,7 +27,7 @@ func TestSCUMFactIngestMaintainsPlatformTablesAndWelcomeQueue(t *testing.T) {
|
||||
ObservedAt: observedAt, LoginObservedAt: observedAt, Position: &domain.SCUMPosition{X: 10, Y: 20, Z: 3}, BankBalance: &bank, GoldBars: &gold, RiddenGameVehicleID: "game-veh-1",
|
||||
}},
|
||||
Vehicles: []domain.SCUMVehicleFact{{
|
||||
GameVehicleID: "game-veh-1", VehicleClass: "BPC_Laika_C", DisplayName: "Laika", Exists: &exists, Locked: &locked, LockedBySteamID: "76561198000000001", LockedAt: observedAt, ObservedAt: observedAt, Position: &domain.SCUMPosition{X: 400, Y: 200, Z: 0},
|
||||
GameVehicleID: "game-veh-1", VehicleClass: "BPC_Laika_C", DisplayName: "Laika", Exists: &exists, Locked: &locked, Functional: &functional, LockedBySteamID: "76561198000000001", LockedAt: observedAt, ObservedAt: observedAt, Position: &domain.SCUMPosition{X: 400, Y: 200, Z: 0},
|
||||
}},
|
||||
})
|
||||
if err != nil {
|
||||
@@ -61,7 +62,7 @@ func TestSCUMFactIngestMaintainsPlatformTablesAndWelcomeQueue(t *testing.T) {
|
||||
t.Fatalf("unexpected user trajectory rows: rows=%+v err=%v", userTracks, err)
|
||||
}
|
||||
vehicles, err := svc.ListSCUMVehiclesForSession(session, domain.SCUMVehicleFilter{ServerInstanceID: instance.ID})
|
||||
if err != nil || len(vehicles) != 1 || vehicles[0].GameVehicleID != "game-veh-1" || !vehicles[0].Exists || !vehicles[0].Locked {
|
||||
if err != nil || len(vehicles) != 1 || vehicles[0].GameVehicleID != "game-veh-1" || !vehicles[0].Exists || !vehicles[0].Locked || vehicles[0].Functional == nil || !*vehicles[0].Functional {
|
||||
t.Fatalf("unexpected SCUM vehicles: vehicles=%+v err=%v", vehicles, err)
|
||||
}
|
||||
vehicleTracks, err := svc.ListSCUMVehicleTrajectoriesForSession(session, domain.SCUMVehicleTrajectoryFilter{ServerInstanceID: instance.ID})
|
||||
|
||||
Reference in New Issue
Block a user