Separate interable layer into pickup and place

main
copygirl 11 months ago
parent 4b4b1eac3d
commit 60e6b8c564
  1. 2
      objects/Item.cs
  2. 2
      objects/grid.tscn
  3. 11
      player/PickupController.cs
  4. 3
      project.godot
  5. 11
      scripts/globals/PhysicsLayer.cs

@ -19,7 +19,7 @@ public partial class Item : RigidBody3D
} }
// Set the collision properties here so we don't have to specify them in each item scene separately. // Set the collision properties here so we don't have to specify them in each item scene separately.
CollisionLayer = (uint)(PhysicsLayer.Item | PhysicsLayer.Interactable); CollisionLayer = (uint)(PhysicsLayer.Item | PhysicsLayer.Pickup);
CollisionMask = (uint)(PhysicsLayer.Static | PhysicsLayer.Dynamic | PhysicsLayer.Player | PhysicsLayer.Item); CollisionMask = (uint)(PhysicsLayer.Static | PhysicsLayer.Dynamic | PhysicsLayer.Player | PhysicsLayer.Item);
Freeze = FindParent("Grid") != null; Freeze = FindParent("Grid") != null;

@ -3,7 +3,7 @@
[ext_resource type="Script" path="res://objects/Grid.cs" id="1_7yhbt"] [ext_resource type="Script" path="res://objects/Grid.cs" id="1_7yhbt"]
[node name="Grid" type="Area3D"] [node name="Grid" type="Area3D"]
collision_layer = 256 collision_layer = 512
collision_mask = 0 collision_mask = 0
monitoring = false monitoring = false
script = ExtResource("1_7yhbt") script = ExtResource("1_7yhbt")

@ -94,7 +94,10 @@ public partial class PickupController : Node3D
} }
if (HasItemsHeld) { if (HasItemsHeld) {
if ((RayToMouseCursor() is RayResult ray) && (ray.Collider is Grid grid) // This ray will be blocked by static and dynamic objects.
const PhysicsLayer Mask = PhysicsLayer.Place | PhysicsLayer.Static | PhysicsLayer.Dynamic;
if ((RayToMouseCursor(Mask) is RayResult ray) && (ray.Collider is Grid grid)
// Make sure this is placed against the top of the grid. // Make sure this is placed against the top of the grid.
&& CanPlaceAgainst(grid, ray.Normal) && CanPlaceAgainst(grid, ray.Normal)
// Ensure item is not being added to itself or nested items. // Ensure item is not being added to itself or nested items.
@ -114,7 +117,7 @@ public partial class PickupController : Node3D
_grid = null; _grid = null;
} }
} else { } else {
var interactable = RayToMouseCursor()?.Collider; var interactable = RayToMouseCursor(PhysicsLayer.Pickup)?.Collider;
// Remove the outline from the previously looked-at item. // Remove the outline from the previously looked-at item.
if (CurrentItem != null) SetMeshLayerOutline(CurrentItem.Model, OutlineMode.Disable); if (CurrentItem != null) SetMeshLayerOutline(CurrentItem.Model, OutlineMode.Disable);
@ -138,7 +141,7 @@ public partial class PickupController : Node3D
} }
} }
RayResult RayToMouseCursor() RayResult RayToMouseCursor(PhysicsLayer collisionMask)
{ {
var camera = _player.Camera.Camera; var camera = _player.Camera.Camera;
var mouse = GetViewport().GetMousePosition(); var mouse = GetViewport().GetMousePosition();
@ -146,7 +149,7 @@ public partial class PickupController : Node3D
var to = from + camera.ProjectRayNormal(mouse) * PickupDistance; var to = from + camera.ProjectRayNormal(mouse) * PickupDistance;
var query = PhysicsRayQueryParameters3D.Create(from, to); var query = PhysicsRayQueryParameters3D.Create(from, to);
query.CollisionMask = (uint)PhysicsLayer.Interactable; query.CollisionMask = (uint)collisionMask;
query.CollideWithAreas = true; query.CollideWithAreas = true;
// Exclude the `CurrentItem` from collision checking if it's being held. // Exclude the `CurrentItem` from collision checking if it's being held.
query.Exclude = HasItemsHeld ? [ CurrentItem.GetRid() ] : []; query.Exclude = HasItemsHeld ? [ CurrentItem.GetRid() ] : [];

@ -87,7 +87,8 @@ interact_place={
3d_physics/layer_2="Dynamic" 3d_physics/layer_2="Dynamic"
3d_physics/layer_3="Player" 3d_physics/layer_3="Player"
3d_physics/layer_4="Item" 3d_physics/layer_4="Item"
3d_physics/layer_9="Interactable" 3d_physics/layer_9="Pickup"
3d_physics/layer_10="Place"
[rendering] [rendering]

@ -1,8 +1,17 @@
[Flags] [Flags]
public enum PhysicsLayer : uint { public enum PhysicsLayer : uint {
/// <summary> Objects that are part of the scene, and never move. </summary>
Static = 1 << 0, Static = 1 << 0,
/// <summary> Objects the player collides with, but may move. </summary>
Dynamic = 1 << 1, Dynamic = 1 << 1,
/// <summary> The player. </summary>
Player = 1 << 2, Player = 1 << 2,
/// <summary> Small objects the player doesn't collide with, but collide with the player. </summary>
Item = 1 << 3, Item = 1 << 3,
Interactable = 1 << 8,
/// <summary> Objects that may be picked up. </summary>
Pickup = 1 << 8,
/// <summary> Objects that other objects may be placed against. </summary>
Place = 1 << 9,
} }

Loading…
Cancel
Save