cirnogodot/Scripts/Components/ProximityPlayerDetection.cs
2025-02-04 10:03:04 +01:00

45 lines
No EOL
1.5 KiB
C#

using System.Diagnostics;
using Godot;
using Godot.Collections;
namespace Cirno.Scripts.Components;
public partial class ProximityPlayerDetection : PlayerDetection
{
public override bool IsPlayerInRange { get; set; }
public override bool IsPlayerInSight(uint collisionMask)
{
if (_cachedPlayer == null) return false;
var spaceState = GetWorld2D().DirectSpaceState;
// I have no idea why I need to use the parent's collision mask instead of the local one but it doesn't detect the player otherwise
var query = PhysicsRayQueryParameters2D.Create(this.GlobalPosition, _cachedPlayer.GlobalPosition, collisionMask, new Array<Rid> { GetRid() });
// var query = PhysicsRayQueryParameters2D.Create(this.GlobalPosition, _cachedPlayer.GlobalPosition, CollisionMask, new Array<Rid> { GetRid() });
var result = spaceState.IntersectRay(query);
// If count is 0 then the player is in sight, otherwise there is level geometry in the way
return result.Count == 0;
}
private void _on_area_entered(Area2D area)
{
// Assume area is player for now
if (area is not InteractionController player) return;
Debug.WriteLine("Enemy detection area Entered by interaction controller");
_cachedPlayer = player;
IsPlayerInRange = true;
}
private void _on_area_exited(Area2D area)
{
if (area is not InteractionController player) return;
IsPlayerInRange = false;
}
}