diff --git a/src/physics/collision_scene.c b/src/physics/collision_scene.c index 4b15cdc..2133156 100644 --- a/src/physics/collision_scene.c +++ b/src/physics/collision_scene.c @@ -402,8 +402,14 @@ int collisionSceneRaycastDoorways(struct CollisionScene* scene, struct Room* roo } if (raycastQuadShape(&doorway->quad, ray, roomDistance, &hitTest) && hitTest.distance < roomDistance) { - roomDistance = hitTest.distance; - nextRoom = currentRoom == doorway->roomA ? doorway->roomB : doorway->roomA; + // Check that the doorway wasn't hit from the wrong side + int expectedRoom = vector3Dot(&doorway->quad.plane.normal, &hitTest.normal) < 0.0f ? doorway->roomA : doorway->roomB; + int otherRoom = currentRoom == doorway->roomA ? doorway->roomB : doorway->roomA; + + if (expectedRoom == otherRoom) { + nextRoom = otherRoom; + roomDistance = hitTest.distance; + } } } diff --git a/tools/level_scripts/world.lua b/tools/level_scripts/world.lua index 4acfa17..482242c 100644 --- a/tools/level_scripts/world.lua +++ b/tools/level_scripts/world.lua @@ -22,13 +22,11 @@ for doorway_index, doorway in pairs(sk_scene.nodes_for_type('@doorway')) do local room_a = room_export.node_nearest_room_index(doorway.node, nil) local room_b, room_b_bb = room_export.node_nearest_room_index(doorway.node, room_a) - if room_b_block then - local room_b_center = room_b_bb:lerp(0.5) + local room_b_center = room_b_bb:lerp(0.5) - -- check if the doorway is facing room A - if (room_b_center - quad.corner):dot(quad.plane.normal > 0) then - room_a, room_b = room_b, room_a - end + -- Check if the doorway is facing room A + if (room_b_center - quad.corner):dot(quad.plane.normal) > 0 then + room_a, room_b = room_b, room_a end table.insert(room_doorways[room_a + 1], doorway_index - 1)