Moved player detection to external script

This commit is contained in:
Marco 2025-02-04 10:03:04 +01:00
commit d8e1459194
8 changed files with 237 additions and 69 deletions

View file

@ -0,0 +1,17 @@
using Godot;
using Godot.Collections;
namespace Cirno.Scripts.Components;
public partial class PlayerDetection : Area2D
{
public InteractionController CachedPlayer => _cachedPlayer;
protected InteractionController _cachedPlayer;
public virtual bool IsPlayerInRange { get; set; }
public virtual bool IsPlayerInSight(uint collisionMask)
{
return false;
}
}

View file

@ -0,0 +1,45 @@
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;
}
}