From 1104ff273b21adfac8189c613117d47ec4c92a07 Mon Sep 17 00:00:00 2001 From: Brody Brooks Date: Mon, 26 Jan 2026 11:51:43 -0800 Subject: [PATCH] player_interaction: Each instance keeps track of its own camera --- .../player_interaction.modifier.api.wren | 6 +++++ .../system/player_interaction.modifier.wren | 22 +++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/assets/system/player_interaction.modifier.api.wren b/assets/system/player_interaction.modifier.api.wren index a315f55..1f306f7 100644 --- a/assets/system/player_interaction.modifier.api.wren +++ b/assets/system/player_interaction.modifier.api.wren @@ -79,6 +79,8 @@ class Fields { static event_name : String { "event_name" } static distance : String { "distance" } static is_active : String { "is_active" } + static camera : String { "camera" } + static seen_interaction : String { "seen_interaction" } } import "luxe: world/states" for AState, States, Op @@ -101,6 +103,8 @@ class APIGet { event_name(entity: Entity) : String { Modifier.get(entity).event_name } distance(entity: Entity) : Num { Modifier.get(entity).distance } is_active(entity: Entity) : Bool { Modifier.get(entity).is_active } + camera(entity: Entity) : Num { Modifier.get(entity).camera } + seen_interaction(entity: Entity) : Num { Modifier.get(entity).seen_interaction } } class APISet { @@ -108,6 +112,8 @@ class APISet { event_name(entity: Entity, value: String) { Modifier.get(entity).event_name = value } distance(entity: Entity, value: Num) { Modifier.get(entity).distance = value } is_active(entity: Entity, value: Bool) { Modifier.get(entity).is_active = value } + camera(entity: Entity, value: Num) { Modifier.get(entity).camera = value } + seen_interaction(entity: Entity, value: Num) { Modifier.get(entity).seen_interaction = value } } var APIGetter = APIGet.new() diff --git a/assets/system/player_interaction.modifier.wren b/assets/system/player_interaction.modifier.wren index 6ad87fc..7c802a6 100644 --- a/assets/system/player_interaction.modifier.wren +++ b/assets/system/player_interaction.modifier.wren @@ -18,6 +18,12 @@ class Data { #hidden var is_active: Bool = true + + #hidden + var camera: Handle = 0 + + #hidden + var seen_interaction: Handle = 0 } #api @@ -48,9 +54,9 @@ class System is Modifier { attach(player: Entity, data: Data) { Log.print("attached to `%(Entity.name(player))` `%(player)` - `%(This)`") - _camera = Camera.get_default(_world) + data.camera = Camera.get_default(_world) - Log.print("Camera Found: %(_camera != null) / %(Entity.name(_camera))") + Log.print("Camera Found: %(data.camera != null) / %(Entity.name(data.camera))") // if (!Physics3D.has(_world)) { Physics3D.create_in(_world) @@ -71,18 +77,26 @@ class System is Modifier { Log.print("[[ USE ]]") } - var cam_pos = Transform.get_pos_world(_camera) - var look_dir = Transform.local_dir_to_world(_camera, 0, 0, -1) + var cam_pos = Transform.get_pos_world(data.camera) + var look_dir = Transform.local_dir_to_world(data.camera, 0, 0, -1) var look_pos = Math.add(cam_pos, look_dir) var did_hit: Bool = false var hits = Physics3D.cast_ray(_world, cam_pos, look_dir, data.distance) + var last_seen = data.seen_interaction + data.seen_interaction = 0 + for (hit: CastRayResult in hits) { if (hit.body_entity == player) continue if (Body3D.get.is_sensor(hit.body_entity)) continue did_hit = true + data.seen_interaction = hit.body_entity + if (hit.body_entity != last_seen) { + Log.print("Entity Seen: %(Entity.name(hit.body_entity))") + } + look_pos = hit.pos break }