SELECT 'player' AS subjectType, account.id AS subjectId, CAST(profile.id AS TEXT) AS userProfileId, CAST(prisoner.id AS TEXT) AS gamePlayerId, CAST(mount.vehicle_entity_id AS TEXT) AS vehicleId, CAST(entity.id AS TEXT) AS entityId, NULL AS baseId, entity.location_x AS x, entity.location_y AS y, entity.location_z AS z, strftime('%Y-%m-%dT%H:%M:%SZ', prisoner.last_save_time, 'unixepoch') AS observedAt FROM user_profile profile JOIN user account ON account.id = profile.user_id JOIN prisoner ON prisoner.id = profile.prisoner_id JOIN prisoner_entity ON prisoner_entity.prisoner_id = prisoner.id JOIN entity ON entity.id = prisoner_entity.entity_id LEFT JOIN prisoner_vehicle_mountee_info mount ON mount.prisoner_id = prisoner.id WHERE (:subjectType IS NULL OR :subjectType = 'player') AND (:subjectId IS NULL OR account.id = :subjectId) AND (:activeWithinSeconds IS NULL OR profile.last_logout_time IS NULL OR profile.last_login_time > profile.last_logout_time OR prisoner.last_save_time >= CAST(strftime('%s', 'now') AS INTEGER) - :activeWithinSeconds OR profile.last_login_time >= strftime('%Y-%m-%dT%H:%M:%fZ', 'now', printf('-%d seconds', :activeWithinSeconds))) UNION ALL SELECT 'vehicle', CAST(spawner.vehicle_entity_id AS TEXT), NULL, NULL, CAST(spawner.vehicle_entity_id AS TEXT), CAST(entity.id AS TEXT), NULL, entity.location_x, entity.location_y, entity.location_z, strftime('%Y-%m-%dT%H:%M:%SZ', spawner.vehicle_last_access_time, 'unixepoch') FROM vehicle_spawner spawner JOIN entity ON entity.id = spawner.vehicle_entity_id WHERE (:subjectType IS NULL OR :subjectType = 'vehicle') AND (:subjectId IS NULL OR CAST(spawner.vehicle_entity_id AS TEXT) = :subjectId) AND (:activeWithinSeconds IS NULL OR spawner.vehicle_last_access_time >= CAST(strftime('%s', 'now') AS INTEGER) - :activeWithinSeconds) UNION ALL SELECT 'base', CAST(base.id AS TEXT), CAST(base.owner_user_profile_id AS TEXT), NULL, NULL, NULL, CAST(base.id AS TEXT), base.location_x, base.location_y, 0, NULL FROM base WHERE (:subjectType IS NULL OR :subjectType = 'base') AND (:subjectId IS NULL OR CAST(base.id AS TEXT) = :subjectId) UNION ALL SELECT 'flag', CAST(flag.element_id AS TEXT), CAST(element.owner_profile_id AS TEXT), CAST(owner.prisoner_id AS TEXT), NULL, CAST(flag.element_id AS TEXT), CAST(element.base_id AS TEXT), element.location_x, element.location_y, element.location_z, strftime('%Y-%m-%dT%H:%M:%SZ', flag.overtake_end_time, 'unixepoch') FROM base_element_flag flag JOIN base_element element ON element.element_id = flag.element_id LEFT JOIN user_profile owner ON owner.id = element.owner_profile_id WHERE (:subjectType IS NULL OR :subjectType = 'flag') AND (:subjectId IS NULL OR CAST(flag.element_id AS TEXT) = :subjectId) LIMIT COALESCE(:limit, 500)