mirror of
https://gitlab.com/MaddoScientisto/cirnogodot.git
synced 2026-06-07 22:25:53 +00:00
Moved player detection to external script
This commit is contained in:
parent
6968bbe72b
commit
d8e1459194
8 changed files with 237 additions and 69 deletions
17
Scripts/Components/PlayerDetection.cs
Normal file
17
Scripts/Components/PlayerDetection.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
45
Scripts/Components/ProximityPlayerDetection.cs
Normal file
45
Scripts/Components/ProximityPlayerDetection.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue